过去,我在C#中已经详细审查了async
和await
,包括审查了我在该主题中发现的所有StackOverflow问题,但是我从来没有< / em>由于以下原因在代码中实现了async
和await
:
await
,以节省少量性能。引入异步调用会在执行顺序方面带来一定程度的复杂性,并且为了获得较小的性能,我一直觉得这种复杂性不值得我经常在工作面试中被问到对async
和async
的理解,我可以回答OK,但是我从来没有完全理解或见证了await
和async
是一段代码中明显更可取的模式的情况。由于我不习惯使用await
和async
,因此我希望能够识别出用例或方案何时呼吁使用await
和{{ 1}}。在系统中通常实施的引人注目的用例或场景的良好实践示例是什么?
答案 0 :(得分:2)
一个很好的例子是将数据保存到文件或数据库中。
这是一个例子:
private async void Button_Click(object sender, RoutedEventArgs e)
{
string StartDirectory = @"c:\Users\exampleuser\start";
string EndDirectory = @"c:\Users\exampleuser\end";
foreach (string filename in Directory.EnumerateFiles(StartDirectory))
{
using (FileStream SourceStream = File.Open(filename, FileMode.Open))
{
using (FileStream DestinationStream = File.Create(EndDirectory + filename.Substring(filename.LastIndexOf('\\'))))
{
await SourceStream.CopyToAsync(DestinationStream);
}
}
}
}
直接从Microsoft实现:https://docs.microsoft.com/en-us/dotnet/standard/io/asynchronous-file-i-o
答案 1 :(得分:0)
好吧,我认为人们似乎在这里忘记的是,与I/O completion ports
很好地封装的async/await
(IOCP)一起使用时,异步I / O 不使用昂贵的线程从而使您能够以最小的线程开销每秒执行更多I / O操作。参见 There Is No Thread
纯 overlapped I / O虽然是异步的,但它确实需要线程等待Windows文件句柄,因此使其不如IOCP高效。< / p>
所有I / O本质上都是异步的,诸如Stream.Read()之类的同步方法是无用的
那是不对的。还有阻塞I / O 。您很快就会知道,由于线程使用量激增,您正在使用阻塞I / O。例如HAPIHL7 .NET库中的阻止I / O用于网络I / O操作。
答案 2 :(得分:-2)
感谢@David Haim提示您阅读异步IO -https://en.wikipedia.org/wiki/Asynchronous_I/O。关键是,在将要执行多次操作的系统中,重要的是要计算出异步/等待的累积性能可以得到显着改善(即使它只是产生很小的性能)在方法级别增加)
我目前正在从事的项目是一个很好的例子,说明需要实施async/await
。该系统与直接连接到PC的环境测量设备(例如天气监测仪器)进行通信,并定期进行定期轮询。由于这种轮询是密集型的并且可能是大批量的,因此进行任何不依赖于返回数据的操作(尤其是在使用轮询值期间)进行操作所节省的性能会显着增加。严格来讲,系统中的这种轮询会导致需要并行性,并且除了使用async
和await
操作之外,还可能需要考虑性能。
通常,任何大量和/或高频的实时数据轮询都可能构成代码中async/await
某处的引人注目的用例。