c# - 可扩展的套接字事件队列处理

标签 c# sockets networking tcp stream

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

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

但是,我想对事件消息进行排队,直到我有“足够”(N) 条事件消息,或者直到没有更多消息在线……然后启动线程池 worker 来处理一批事件消息。此外,我希望按顺序处理所有事件,因此我只希望一个线程池 worker 一次处理此问题。

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

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

最佳答案

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

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

关于c# - 可扩展的套接字事件队列处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/99651/

相关文章:

c# - 使用 SocketAsyncEventArgs 每秒接收 20 次

android - 制作像 Discord 这样的多平台应用程序的技巧

c# - 我可以在不损失性能的情况下从异步套接字切换到文件流吗?

c# - 如何强制二进制应用程序使用 C# 工具中的 SOCKS 代理?

http - 如何测试下载到另一个国家特定服务器的速度?

c# - 如何实现撤销功能

c# - Azure Function 无法使用表绑定(bind)执行 : connection refused

c# - 服务器中是否可以知道 HTTP 响应何时到达客户端? (ASP.NET)

c# - 读取和写入 header 消息 MQ C#

c# - 实现抽象方法时更改参数类型