2009-02-26 4 views
0

나는 어리둥절한 응용 프로그램에서 이상한 행동을하고 있습니다.스레드 풀에서 표준 스레드를 재사용 할 수 있습니까?

나는 스레드를 만들고, worker라고 부르 자. 통신 요청 처리를 담당한다. 스레드가 요청을 소비하고 메시지를 보내는 동안 클라이언트는 파이프에 씁니다.

이제 스레드의 메인 루프는 다음과 같이 있습니다

lock(this) 
{ 
    object_id = Transport.BeginSend(xxx, xxx, callback, yyy) 
    clientsObjects[object_id] = client_id; 
} 

이제 콜백은 내가 쓴 것보다는 좀 더 복잡 CLIENT_ID을 (액세스 할 필요가 있지만, 일이 콜백이다 ...

OBJECT_ID, 그냥 BeginSend는 콜백 clientsObjects[object_id] = client_id; 실행하기 전에 실제로 일어나는 것을 너무 빨리 발사 할 수 있기 때문에

void Callback(IAsyncResult ar) 
{ 
    State st = (State)ar; 
    lock(this) 
    { 
    client_id = clientsObjects[st.object_id] 
    } 
} 

자물쇠가 UdpClient.BeginSend를 호출 가정 수신

이제 문제는 작동하지 않는다는 것입니다. 그럼 지금은 잘 작동합니다 ... 왜? BeginSend를 실행중인 스레드와 콜백을 실행중인 스레드의 ManagedThreadIds를 추적 할 때 가끔 그 스레드는 동일한 ThreadId를 갖습니다 !!

그럴 수 있습니까? 어떻게 그럴 수 있습니까? 내가 뭘 잘못하고 있는지에 대한 제안이 있니?

댓글 : 실제 코드는 정확히 같지 않습니다. 전송은 전송 계층을 쉽게 변경할 수있는 UDPClient를 감싸는 래퍼입니다. 잠금은 실제로는 잠금이 아니라 스핀 록입니다 ...하지만 개념 자체는 다소 차이가 있습니다. 적어 뒀어.

답변

1

Here은 예상대로 비동기 적으로 실제로 동 기적으로 작동하는 Stream.BeginRead() 함수에 대해 설명하는 이전 기사입니다. 2004 년 기사이므로 .NET 1.0/1.1을 언급 한 것으로 가정합니다. 이 기사에서는 UdpClient.BeginSend()를 특별히 언급하지 않지만 Socket의 BeginXXX 함수가 동일한 동작을하는지 궁금해했습니다. 특히 즉시 읽을 데이터가있는 경우 특히 그렇습니다. 이것이 가능성이 있는지보기 위해 웹을 점검 할 가치가 있습니다.

BeginSend() 함수의 state 매개 변수를 통해 client_id를 콜백 함수에 전달할 수 있습니까?

object_id = Transport.BeginSend(xxx, xxx, Callback, client_id); 
+0

놀랍지 만 실제로 비동기 호출은 동기식이됩니다. –

관련 문제