2013-04-01 35 views
1

我看MSDN SocketAsyncEventArgs的例子,并不能完全确定在100个无限写入我们客户端的情况下将创建多少个线程?MSDN SocketAsyncEventArgs exapmle:创建了多少个线程?

或者更好,如果我们可以将ProcessReceive成某种形式的通信协议,讨论到客户端和回读无限将我们所有的ProcessReceive在100级独立运行的线程或将是有几分相像Unity3d程序在一个线程?

我很感兴趣,因为在那个例子中没有看到任何直接线程相关的代码,除了Semaphore

回答

2

对此的答案是“它取决于”。 SendAsync,AcceptAsyncReceiveAsync使用异步IO和完成端口。这是通过用于IO线程的独立线程池完成的。这与“其他”线程池的操作类似 - 它具有最小值和最大值。 IO线程池的默认最大值为1000 [1]因此可以想象,该示例可能高达100个线程。

线程池根据需要在等待状态下创建线程,并且随着异步IO完成,这些线程将从等待状态中移出以处理结果。

但是,实际上它取决于何时发送数据包和何时接收数据包。可以想象,如果对所有发送的所有响应都按顺序发生,则它可能低至1个线程。但是,这可能非常罕见。实际上,您可以真正估计的最接近1到100个线程(包括1和100个线程)。

您可以通过跟踪每个异步操作的Thread.CurrentThread.ManagedThreadId进行测试。

要记住的重要一点是Completed事件是在线程池线程上产生的,应该采取常规的线程安全预防措施(例如使用Semaphore)。

[1]乔·达菲,在Windows,2008年,Addison-Wesley出版社专业

并行编程