当您使用BeginReceive / EndReceive处理套接字IO时,IOCP线程会调用回调。
完成接收后,您需要处理数据。
通常样本会在回调线程上完成工作,这有点令人困惑。
如果您正在处理数百个活动连接,则在IOCP线程上运行处理最终会产生一个包含数百个线程的进程。 ThreadPool会帮助限制并发线程的数量吗?
答案 0 :(得分:2)
我不知道每个人都有一个通用的“正确答案” - 这将取决于您的个人用例。
如果你考虑沿着ThreadPool路径走下去,这些是需要考虑的事情。
您是否可以支持无序/并发消息处理?
如果Socket A快速连续收到消息1,2和3,它们最终可能会同时处理或出现故障。
.NET具有每个CPU的线程池,如果一个CPU用尽,它可能会“窃取”来自其他CPU的任务。这可能意味着您的消息可能以某种随机顺序执行。
不要忘记考虑无序处理可能对客户端做什么 - 例如,如果他们发送三条需要响应的消息,则无序发送响应可能是个问题。
如果您必须按顺序处理每条消息,那么您可能必须实现自己的线程池。
您是否需要关注潜在的拒绝服务?
如果一个套接字突然发送一大堆数据,接受所有这些处理可能会堵塞内部队列和内存。您可能必须限制您接受的未处理数据量。
答案 1 :(得分:0)
IOCP线程用于服务IO操作。如果您通过iocp回调执行的工作可能长时间运行,或者导致锁或其他阻止我执行块的功能,则最好将其交给工作线程。