【发布时间】:2015-02-25 01:35:50
【问题描述】:
在寻找一种优雅的方式从 UDP 套接字异步接收数据报流时,我遇到了这个问题:How to use asynchronous Receive for UdpClient in a loop?
我理解第一个答案的优点,因为他们使用熟悉的BeginReceive/EndReceive 方法。这个解决方案很好,因为没有线程被阻塞。
second answer 提供了两种不同的任务式解决方案,一种使用ReceiveAsync,另一种使用同步Receive 方法。我想知道,在这种情况下,优势是什么。据我了解,即使在 ReceiveAsync 的情况下,仍然有一个(线程池?)线程在等待事情发生。
在这种情况下使用异步方法有优势吗?如果没有,有没有办法使用异步方法来实现这种类型的模式,而不需要线程、任务或其他阻塞对象的开销?
【问题讨论】:
-
As I understand it, even in the ReceiveAsync case, there's still a (threadpool?) thread waiting around for things to happen.异步的全部意义在于这不是真的。阅读blog.slaks.net/2014-12-23/parallelism-async-threading-explained -
特别是,
*Async()方法只是对Begin*()方法的更友好的包装。 -
@SLaks 查看链接的帖子;它实际上是不必要地分配线程池线程来做一些工作,虽然不像 OP 认为的那么多。
-
@Servy:这很好;他的
Task.Run()电话完全没用。 -
您从第二个答案中得到了美好的画面。他故意不对收到的数据做任何事情,也不处理任何错误。一旦你把它充实起来,你肯定会看到不同之处。使用 APM 时,这些细节会变得非常糟糕。
标签: c# .net asynchronous network-programming async-await