gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:20:42 24 4
gpt4 key购买 nike

我正在运行一个有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com