나는 어리둥절한 응용 프로그램에서 이상한 행동을하고 있습니다.스레드 풀에서 표준 스레드를 재사용 할 수 있습니까?
나는 스레드를 만들고, 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를 감싸는 래퍼입니다. 잠금은 실제로는 잠금이 아니라 스핀 록입니다 ...하지만 개념 자체는 다소 차이가 있습니다. 적어 뒀어.
놀랍지 만 실제로 비동기 호출은 동기식이됩니다. –