2014-03-06 2 views
2

ThreadPool을 사용하여 소켓 서버에서 연결된 모든 소켓을 개별적으로 처리합니다. 그러나 나는 BeginReceive의 콜백도 HandleAsyncReceive 콜백이 또한 새로운 스레드에서 (ThreadPool이로 잡고 된)가 실행됩니다 않습니다 ThreadPool이콜백을 사용하여 ThreadPool 사용

ThreadPool.QueueUserWorkItem(o => 
{ 
    if (ClientExchange != null && ClientExchange(asynchronousState)) { 
     if (ClientConnect != null) { 
      ClientConnect(asynchronousState); 
     } 
    } 
    ConnectedClients.Add(ipEndPoint, socket); 
    socket.BeginReceive(asynchronousState.Buffer, 0, asynchronousState.Buffer.Length, SocketFlags.None, HandleAsyncReceive, asynchronousState); 
}); 

내에서 실행 얻는 경우에 궁금해?

+0

'Thread.CurrentThread.ManagedThreadId'를 인쇄했을 때 당신은 무엇을 보았습니까? –

+0

풀 스레드를 명시 적으로 사용할 필요가 없습니다. 'BeginReceive' 콜백이 호출 된 동일한 스레드에서 처리를 수행 할 수 있습니다.이 스레드는 무작위이지만 다른 풀 스레드가 될 것입니다. 이 답변에 대한 의견을 확인하십시오 : http://stackoverflow.com/a/22017432/1768303 – Noseratio

답변

1

async IO의 콜백은 스레드 풀 스레드에서 호출됩니다.

스레드 풀 스레드는 특정 용도로 예약되지 않습니다. 모든 작업 항목은 완전히 다른 스레드 ID를 볼 수 있습니다. 또는 모든 작업 항목이 동일한 스레드 ID를 볼 수 있습니다. 아무 것도 보장되지 않습니다.

일반적으로 코드를 실행할 정확한 스레드에 의존하지 마십시오. 이것은 대개 버그입니다. 당신은 이것에 신경 쓰지 않아야합니다.

는 내가 뭘 원하는 비동기 IO의 맥락에서 이해가되지 않습니다 다른 스레드

에있는 모든 가능 소켓을 처리합니다. 비동기 IO는 스레드가 없습니다. 입출력이 실행되는 동안에는 사용중인 스레드가 없습니다.

+0

나는 새로운 스레드에 대한 콜백을하고 싶지 않다. 내가하고 싶은 것은 모든 스레드를 수용하는 모든 소켓을 처리하는 것이다. 그것의 콜백의) –

+0

다른 이상한 방법에 대한 내 업데이트 된 주제를 참조하십시오 (코드 내의 주석 참조) –

+0

당신의 대답은 분명하지 않다 –