1

我查看了 MSDN SocketAsyncEventArgs示例,无法完全了解在 100 个无限写入我们客户端的情况下将创建多少线程?

或者如果我们改用ProcessReceive某种形式的通信协议来与客户端对话并无限地回读会更好,我们会ProcessReceive在 100 个单独的运行线程中,还是在一个线程中有点像 Unity3d 例程?

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

4

1 回答 1

2

对此的答案是“视情况而定”。 SendAsync, AcceptAsync, 并ReceiveAsync使用异步 IO 和完成端口。这是通过 IO 线程的独立线程池完成的。这类似于“其他”线程池的操作——它有一个最小值和最大值。IO 线程池的默认最大值为 1000 [1] 因此可以想象,该示例可能高达 100 个线程。

线程池根据需要创建处于等待状态的线程,并在异步 IO 完成时将这些线程从等待状态中取出以处理结果。

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

您可以通过跟踪Thread.CurrentThread.ManagedThreadId每个异步操作来测试这一点。

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

[1] Joe Duffy,Windows 上的并发编程,2008,Addison-Wesley Professional

于 2013-04-02T00:29:41.100 回答