c# - 数千个并发数据包,ThreadPool vs BeginRead?

标签 c# multithreading timer threadpool udpclient

我正在运行一个有 5000 个 UdpClient 实例的应用程序类,因为我需要在不同的端口上同时传输数据包。

我目前正在使用 System.Timers.Timer ,它在 ThreadPool 上运行.它有一个非常短的 Interval,触发了许多 Elapsed 事件。

使用 UdpClientBeginRead/EndRead 函数修改应用程序是否更好? ?

最佳答案

当您处理 IO 操作(即网络、文件系统等)时,您应该始终使用异步操作,即 BeginXXX/EndXXX、XXXAsync/XXXCompleted、异步/等待上下文中的 XXXAsync。这些操作使用众所周知的 IO complition ports .换句话说,它在传输数据时不消耗任何 CPU 资源。一旦加载了请求的数据,它就会从 ThreadPool 中获取一个线程并将处理程序排队到该线程。在您的情况下,您正在浪费 CPU 资源。线程没有做一些有用的工作,只是等待数据传输。此外,ThreadPool 的线程数量有限(通常等于 CPU 内核的数量)。因此,在您的情况下,它一次仅向/从 2 个客户端发送/接收数据。

异步方法可能看起来非常复杂(尤其是 BeginXXX/EndXXX),但是有很多包装器可以显着简化它们的使用。例如,您可以使用 Rx's FromAsyncPattern扩展方法,或者您可以使用新的 async/await异步模型。

关于c# - 数千个并发数据包,ThreadPool vs BeginRead?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13964050/

相关文章:

c++ - 并发写入 vector<bool>

javascript - 两个问题 : this. 方法不是函数 - addEventListener 添加的单击事件在用户单击时运行超过 20 次

C#检测光标是否隐藏

c# - 市场数据的正则表达式

c# - 无法将泛型类型加载到 ASP.NET 应用程序中的另一个 AppDomain

C#:异步运行此代码的不同方法?

c++ - QT 中未定义的信号引用

c# - 如何在 C# 中每 2 小时调用一次方法

c++ - Box2D:让 body 随机下降

c# - 根据多个条件过滤列表