我看一下MSDN SocketAsyncEventArgs示例,并且无法在100个无限写入我们客户端的情况下创建多少个线程?
或者更好的是,如果我们将ProcessReceive
更改为某种形式的通信协议,与客户端进行通信并无限回读,我们所有的ProcessReceive
都将在100个单独运行的线程中,或者在某种程度上类似于Unity3d例程在一个线程?
我很感兴趣,因为在该示例中没有看到除Semaphore
之外的任何与线程相关的直接代码。
答案 0 :(得分:2)
答案是“这取决于”。 SendAsync
,AcceptAsync
和ReceiveAsync
使用异步IO和完成端口。这是通过IO线程的独立线程池完成的。这与“其他”线程池的操作类似 - 它具有最小值和最大值。 IO线程池的默认最大值为1000 [1]因此可以想象,该示例可能高达100个线程。
线程池根据需要在等待状态下创建线程,并且当异步IO完成时,这些线程将退出等待状态以处理结果。
但实际上,它取决于何时发送数据包以及何时收到数据包。可以想象,如果对所有发送的所有响应都按顺序发生,则可能低至1个线程。但是,这可能非常罕见。实际上,你真正估计的最接近的是1到100个线程,包括在内。
您可以通过跟踪每个异步操作的Thread.CurrentThread.ManagedThreadId
来测试它。
要记住的重要一点是,在线程池线程上引发了Completed事件,并且应该采取常规的线程安全预防措施(例如使用Semaphore
)。
[1] Joe Duffy, Windows上的并发编程,2008,Addison-Wesley Professional