使用BeginXXX
方法时,.Net Socket异步API会自动管理线程。例如,如果我有100个活动连接发送和接收TCP
消息,将使用大约3个线程。这让我很好奇。
我的问题可能没有意义,因为我不知道它是如何工作的以及具体要求什么,很抱歉。基本上我需要知道整个过程如何在低级别工作。
答案 0 :(得分:4)
.Net Socket异步API在使用时自动管理线程 BeginXXX方法。
这不太正确。 APM Begin/End
- 样式套接字API根本不管理线程。而是在随机线程上调用完成AsyncCallback
,该线程是异步套接字I / O操作已完成的线程。最有可能的是,这将是一个IOCP池线程(I / O完成端口线程),与您调用BeginXXX
方法的线程不同。有关详细信息,请查看Stephen Cleary的"There Is No Thread"。
经理如何确定哪些连接/读数/着作必须优先 先处理?
没有可用于处理异步I / O操作完成的IOCP线程的情况称为TheadPool
饥饿。当所有池线程忙于执行某些代码(例如,处理接收到的套接字消息)或被阻塞调用(例如WaitHandle.WaitOne()
)阻止时,就会发生这种情况。在这种情况下,I / O完成例程排队到ThreadPool
,以便在线程可用时以FIFO为基础执行。
您可以选择使用ThreadPool
API增加SetMinThreads/SetMaxThreads
的大小,但这样做并不总是一个好主意。实际并发线程的数量无论如何都受到CPU /内核数量的限制,因此您希望尽快完成任何CPU绑定的处理工作并释放线程以返回池中。