IOCP线程与线程池处理消息

时间:2012-03-18 02:42:18

标签: c# asyncsocket beginreceive

当您使用BeginReceive / EndReceive处理套接字IO时,IOCP线程会调用回调。

完成接收后,您需要处理数据。

  • 你应该在回调的调用线程吗?
  • 或者您应该使用ThreadPool.QueueUserWorkItem
  • 运行任务

通常样本会在回调线程上完成工作,这有点令人困惑。

如果您正在处理数百个活动连接,则在IOCP线程上运行处理最终会产生一个包含数百个线程的进程。 ThreadPool会帮助限制并发线程的数量吗?

2 个答案:

答案 0 :(得分:2)

我不知道每个人都有一个通用的“正确答案” - 这将取决于您的个人用例。

如果你考虑沿着ThreadPool路径走下去,这些是需要考虑的事情。

您是否可以支持无序/并发消息处理?

如果Socket A快速连续收到消息1,2和3,它们最终可能会同时处理或出现故障。

.NET具有每个CPU的线程池,如果一个CPU用尽,它可能会“窃取”来自其他CPU的任务。这可能意味着您的消息可能以某种随机顺序执行。

不要忘记考虑无序处理可能对客户端做什么 - 例如,如果他们发送三条需要响应的消息,则无序发送响应可能是个问题。

如果您必须按顺序处理每条消息,那么您可能必须实现自己的线程池。

您是否需要关注潜在的拒绝服务?

如果一个套接字突然发送一大堆数据,接受所有这些处理可能会堵塞内部队列和内存。您可能必须限制您接受的未处理数据量。

答案 1 :(得分:0)

IOCP线程用于服务IO操作。如果您通过iocp回调执行的工作可能长时间运行,或者导致锁或其他阻止我执行块的功能,则最好将其交给工作线程。