我正在运行一个具有 5000 个UdpClient
类实例的应用程序,因为我需要在不同的端口上同时传输数据包。
我目前正在使用System.Timers.Timer
在ThreadPool
. 它有一个非常短Interval
的触发许多Elapsed
事件。
修改应用程序以使用BeginRead
/EndRead
的功能会更好UdpClient
吗?
我正在运行一个具有 5000 个UdpClient
类实例的应用程序,因为我需要在不同的端口上同时传输数据包。
我目前正在使用System.Timers.Timer
在ThreadPool
. 它有一个非常短Interval
的触发许多Elapsed
事件。
修改应用程序以使用BeginRead
/EndRead
的功能会更好UdpClient
吗?
当您使用 IO 操作(即网络、文件系统等)时,您应该始终在 async/await 的上下文中使用异步操作,即 BeginXXX/EndXXX、XXXAsync/XXXCompleted、XXXAsync。这些操作使用众所周知的IO 编译端口。简而言之,它在传输数据时不消耗任何 CPU 资源。一旦加载了请求的数据,它就会从 ThreadPool 中获取一个线程并将处理程序排队到该线程。在您的情况下,您正在浪费 CPU 资源。线程并没有做一些有用的工作,而是等待数据传输。此外,ThreadPool 的线程数量有限(通常等于 CPU 内核的数量)。因此,在您的情况下,它一次仅向/从 2 个客户端发送/接收数据。
异步方法可能看起来非常复杂(尤其是 BeginXXX/EndXXX),但是有很多包装器可以显着简化它们的使用。例如,您可以使用Rx 的 FromAsyncPattern扩展方法,也可以使用新的async/await异步模型。