我的 C# 类必须能够处理通过 tcp 流样式套接字连接接收的大量事件。类的套接字从 tcp 服务器接收的事件消息量是完全可变的。例如,有时它会在十秒内仅接收到一条事件消息,而有时它会在一秒内接收到六十条事件消息。

我正在使用 Socket.ReceiveAsync 来接收消息。如果接收操作处于挂起状态,则 ReceiveAsync 返回 true;如果线路上已有数据且接收操作已同步完成,则 ReceiveAsync 返回 false。如果操作处于挂起状态,Socket 将在 IO 完成线程上调用我的回调,否则我会在当前 (IOC) 线程中调用我自己的回调。此外,与事件消息混合,我还收到对发送到此 TCP 服务器的命令的响应。响应消息立即处理;单独地,通过解雇线程池工作者。

但是,我想对事件消息进行排队,直到有“足够”(N)个事件消息,或者直到线路上不再有事件消息......然后触发线程池工作线程来处理一批事件消息。另外,我希望按顺序处理所有事件,因此我一次只希望一个线程池工作人员处理此问题。

事件消息的处理器只需将消息缓冲区复制到对象中,引发事件,然后将消息缓冲区释放回环形缓冲区池。所以我的问题是......您认为实现这一目标的最佳策略是什么?

您需要更多信息吗?让我知道。谢谢!!

有帮助吗?

解决方案

我不会称每秒 60 个事件为高容量。在如此低的活动水平上,任何套接字处理方法都可以。我已经在单个线程上每秒处理 5,000 个事件,使用的硬件比当前机器的能力要差得多,仅使用 select。

我想说的是,如果您希望扩展,在线程之间单独传递消息将是一场灾难。您需要批处理,否则上下文切换会降低性能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top