【发布时间】:2009-03-02 23:25:22
【问题描述】:
在 C# 中,当使用 BeginReceive/EndReceive 方法接收网络数据时,有什么理由不应该在收到数据包后立即处理它们?一些任务可能需要相当多的 CPU 密集型。我问是因为我已经看到一些将数据包推入处理队列然后在那里处理它们的实现。对我来说,这似乎是多余的,因为据我所知,异步方法也在线程池上运行。
【问题讨论】:
标签: c# networking asynchronous
在 C# 中,当使用 BeginReceive/EndReceive 方法接收网络数据时,有什么理由不应该在收到数据包后立即处理它们?一些任务可能需要相当多的 CPU 密集型。我问是因为我已经看到一些将数据包推入处理队列然后在那里处理它们的实现。对我来说,这似乎是多余的,因为据我所知,异步方法也在线程池上运行。
【问题讨论】:
标签: c# networking asynchronous
通常,您需要接收“足够”的数据包才能拥有“可处理”的数据项。
IMO,最好有一个线程负责接收数据,另一个线程来实际处理它。
【讨论】:
正如 Mitch 所指出的,您需要能够接收足够的数据包才能拥有完整的消息/帧。但是没有理由不立即开始处理该帧并发出另一个 BeginReceive。事实上,如果您认为您的处理可能需要一些时间,您最好将其交给工作线程池,而不是阻止来自 i/o 池的线程(这是您的回调将触发的地方)。
此外,除非您期望连接数量很少,否则生成一个线程来处理每个连接并不是一种非常可扩展的方法,尽管它确实有一些简单的好处。
我最近写了一篇关于网络套接字流水线数据处理的文章,您可以找到 here。
【讨论】: