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