首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单独线程上的UdpClient.BeginReceive与UdpClient.Receive

单独线程上的UdpClient.BeginReceive与UdpClient.Receive
EN

Stack Overflow用户
提问于 2014-08-01 19:28:00
回答 1查看 1.9K关注 0票数 1

在Marc的文章中有一个类似的问题:“异步方法的另一个优点是,您可以始终获取所需的数据,将另一个异步获取排队,然后在现有异步线程上处理新数据,从而为并行性提供更多的选项(一次读取,一次处理)。”

你能给我举个例子说明一下你的意思吗?

我的问题是,我正在侦听UDP数据包,但我没有时间在接收线程中处理它们,因为我希望尽快返回到我的接收端,以避免同时丢失任何数据包(因为套接字将丢弃我没有接收到的任何数据包,因为它不是TCP),这样做最好的方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2014-08-01 19:36:38

使用异步IO,一旦启动IO进程,就可以返回给调用方。因为IO绑定工作的本质是通过操作系统异步完成的,所以我们可以利用这一点。

当您在另一个线程上使用阻塞api (如UdpClient.Recieve )以保持应用程序响应时,该线程将主要阻止等待UdpClient完成其接收方法。使用async IO,正如马克所说,您可以释放线程,直到IO操作完成并同时执行不同的工作为止。

例如,我们可以使用UdpClient.RecieveAsync,它返回一个Task<UdpRecieveResult>。因为一个任务是awaitable (更多关于可服务性的信息,请参见https://stackoverflow.com/a/24954336/1870803 ),所以我们可以利用异步文件:

代码语言:javascript
复制
public async Task RecieveAndDoWorkAsync()
{
     var udpClient = new UdpClient(); // Initialize client

     var recieveTask = udpclient.RecieveAsync();

     // Do some more work

     // Wait for the operation to complete, meanwhile returning control to tge calling method (without creating any new threads)
     await recieveTask  
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25087350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档