如何为Begin / Async调用管理线程(如socket IO)?

时间:2014-06-13 22:27:37

标签: c# multithreading sockets asynchronous

使用BeginXXX方法时,.Net Socket异步API会自动管理线程。例如,如果我有100个活动连接发送和接收TCP消息,将使用大约3个线程。这让我很好奇。

  • API如何进行此线程管理?
  • 如何在要处理的线程之间划分所有连接流?
  • 经理如何优先考虑必须首先处理哪些连接/读数/文字?

我的问题可能没有意义,因为我不知道它是如何工作的以及具体要求什么,很抱歉。基本上我需要知道整个过程如何在低级别工作。

1 个答案:

答案 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绑定的处理工作并释放线程以返回池中。