在Marc的文章中有一个类似的问题:“异步方法的另一个优点是,您可以始终获取所需的数据,将另一个异步获取排队,然后在现有异步线程上处理新数据,从而为并行性提供更多的选项(一次读取,一次处理)。”
你能给我举个例子说明一下你的意思吗?
我的问题是,我正在侦听UDP数据包,但我没有时间在接收线程中处理它们,因为我希望尽快返回到我的接收端,以避免同时丢失任何数据包(因为套接字将丢弃我没有接收到的任何数据包,因为它不是TCP),这样做最好的方法是什么?
发布于 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 ),所以我们可以利用异步文件:
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
}https://stackoverflow.com/questions/25087350
复制相似问题