我正在运行一个具有5000个UdpClient
类实例的应用程序,因为我需要在不同的端口上同时传输数据包。
我目前正在使用System.Timers.Timer
,ThreadPool
运行UdpClient
。它有一个很短的Interval
,有许多Elapsed
个事件被触发。
使用{{3}}的BeginRead
/ EndRead
函数修改应用程序是否会更好?
答案 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异步模型。