C# 将线程池与回调一起使用

C# 将线程池与回调一起使用,c#,multithreading,C#,Multithreading,我正在使用ThreadPool分别处理套接字服务器中连接的每个套接字。但是,我想知道BeginReceive的回调是否也在线程池中执行 ThreadPool.QueueUserWorkItem(o => { if (ClientExchange != null && ClientExchange(asynchronousState)) { if (ClientConnect != null) { ClientConnect(a

我正在使用
ThreadPool
分别处理套接字服务器中连接的每个套接字。但是,我想知道BeginReceive的回调是否也在线程池中执行

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
回调是否也在新线程(由线程池捕获)中执行

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

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

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

我要做的是在不同的线程上处理每个已接受的套接字


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

打印
thread.CurrentThread.ManagedThreadId
时,您看到了什么?您不需要显式使用池线程。您可以在您的
BeginReceive
调用回调的同一线程上进行处理,它将是一个随机但不同的池线程。检查对此答案的注释:我不想在新线程上进行回调,我想做的是在不同线程上处理每个接受的套接字(包括它的所有回调)查看我更新的主题以了解另一种奇怪的方式(查看代码中的注释)是的,这很有用,但是我想在一个单独的线程上处理每个连接,因为在我的自定义类back OnClientConnect和OnClientExchange等中。。。我正在为一些操作使用同步代码,当我在没有线程池的情况下这样做时,我会让所有服务器以及控制台应用程序挂断idk为什么?我不知道,这似乎超出了这个问题的范围。您可以混合使用同步和异步IO。这应该行得通。bug是另外一回事。打开一个新问题并发布代码。