Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理消息的IOCP线程与线程池_C#_Asyncsocket_Beginreceive - Fatal编程技术网

C# 处理消息的IOCP线程与线程池

C# 处理消息的IOCP线程与线程池,c#,asyncsocket,beginreceive,C#,Asyncsocket,Beginreceive,当您使用BeginReceive/EndReceive处理套接字IO时,回调由IOCP线程调用 接收完毕后,您需要处理数据 你应该在回调的调用线程上这样做吗 或者应该使用ThreadPool.QueueUserWorkItem运行任务 通常,示例在回调线程上完成工作,这有点令人困惑 如果您处理的是几百个活动连接,那么在IOCP线程上运行处理最终会导致一个包含数百个线程的进程。线程池是否有助于限制并发线程的数量?我不知道对每个人来说都有一个通用的“正确答案”——这取决于您的具体用例 P>这是

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

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

  • 你应该在回调的调用线程上这样做吗
  • 或者应该使用ThreadPool.QueueUserWorkItem运行任务
通常,示例在回调线程上完成工作,这有点令人困惑


如果您处理的是几百个活动连接,那么在IOCP线程上运行处理最终会导致一个包含数百个线程的进程。线程池是否有助于限制并发线程的数量?

我不知道对每个人来说都有一个通用的“正确答案”——这取决于您的具体用例

<> P>这是一些需要考虑的问题,如果你考虑下线程池路径。 您可以支持无序/并发消息处理吗?

如果套接字A快速连续地接收到消息1、2和3,则它们可能会同时被处理,或者顺序混乱

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

别忘了考虑一下无序处理可能对客户端造成什么样的影响。例如,如果他们发送三条需要响应的消息,发送错误的响应可能是个问题。p> 如果必须按顺序处理每条消息,则可能必须实现自己的线程池

您需要担心潜在的拒绝服务吗?


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

IOCP线程用于提供IO操作。如果由iocp回调执行的工作可能长时间运行,或者导致锁定或其他设施阻止执行,则最好将其交给工作线程。

套接字将接收来自不同客户端的消息,请打开与每个客户端的连接。异步的要点是避免每个连接绑定一个线程。是的,我理解这一点。我的观点是,您无法控制线程池任务的执行顺序。所以,如果你选择使用线程池(或者自己的线程池),你就必须考虑如何处理无序和/或并行执行任务。