成千上万的并发数据包,ThreadPool vs BeginRead?

时间:2012-12-20 01:43:04

标签: c# multithreading timer threadpool udpclient

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

我目前正在使用System.Timers.TimerThreadPool运行UdpClient。它有一个很短的Interval,有许多Elapsed个事件被触发。

使用{{3}}的BeginRead / EndRead函数修改应用程序是否会更好?

1 个答案:

答案 0 :(得分:3)

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

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