使用带回调的ThreadPool

时间:2014-03-06 19:33:05

标签: c# multithreading

我使用ThreadPool分别处理套接字服务器中的每个连接的套接字。但是我想知道BeginReceive的回调是否也在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);
});

HandleAsyncReceive回调是否也在新线程中执行(由ThreadPool抓取)?

1 个答案:

答案 0 :(得分:1)

在线程池线程上调用异步IO的回调。

永远不会为任何特定目的保留线程池线程。每个工作项都可以看到完全不同的线程ID。或者所有工作项都可以看到相同的thread-id。没有任何保证。

通常,您不依赖于运行代码的确切线程。这通常是一个错误。你不应该关心这个(我不清楚你为什么这么做)。

  

我想要做的是处理不同线程上的每个接受的Socket

在异步IO的上下文中没有意义。 Async IO是无线程的。当IO正在运行时,没有使用它的线程。