gpt4 book ai didi

c# - async 相对于 BeginXXX/EndXXX 有什么优势?

转载 作者:行者123 更新时间:2023-11-30 22:00:18 27 4
gpt4 key购买 nike

在寻找一种优雅的方式从 UDP 套接字异步接收数据报流时,我遇到了这个问题:How to use asynchronous Receive for UdpClient in a loop?

我理解第一个答案的优点,因为它们使用熟悉的 BeginReceive/EndReceive 方法。这个解决方案很好,因为没有线程被阻塞。

second answer ,但是给出了两种不同的类似任务的解决方案,一种使用 ReceiveAsync,另一种使用同步 Receive 方法。我想知道,在这种情况下,优势是什么。据我了解,即使在 ReceiveAsync 情况下,仍然有一个(线程池?)线程在等待事情发生。

在这种情况下使用异步方法有优势吗?如果没有,是否有一种方法可以使用异步方法来实现这种类型的模式,而无需线程、任务或其他阻塞对象的开销?

最佳答案

首先,在自然异步 API 中,async-await (TAP) 版本和Begin/End(APM) 都没有阻塞线程(There Is No Thread ).

然而,在这种特定情况下,链接的答案确实不必要地浪费了 ThreadPool 线程,应该避免这种情况。

ReceiveAsync 情况将操作的同步部分(直到 await ReceiveAsync)卸载到 ThreadPool 线程。如果您要执行实质性的 CPU 绑定(bind)操作并且您想要释放调用线程,这将很有用。这似乎并非如此,因为除了创建客户端之外别无他法。

您可以简单地删除 Task.Run 并使用 async 方法:

async Task ListenAsync(int port, CancellationToken token)
{
using (var client = new UdpClient(port))
{
while (true)
{
var result = await client.ReceiveAsync().WithCancellation(token).ConfigureAwait(false);
// process result.Buffer
}
}
}

关于c# - async 相对于 BeginXXX/EndXXX 有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28684302/

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