C#异步等待-什么是引人注目的用例?

时间:2018-07-25 23:32:49

标签: c# asynchronous async-await

过去,我在C#中已经详细审查了asyncawait,包括审查了我在该主题中发现的所有StackOverflow问题,但是我从来没有< / em>由于以下原因在代码中实现了asyncawait

  • 我对主要性能收益的理解是,如果您有一个长期运行的流程,然后执行耗时的逻辑,然后消耗了 first 长期运行的流程返回的内容。我从未遇到过这种情况。我遇到的场景是,在最初的长期运行的流程与依赖于长期运行的流程之间存在 minimum 逻辑,并且并没有强迫 引入{{1 }}和await,以节省少量性能。引入异步调用会在执行顺序方面带来一定程度的复杂性,并且为了获得较小的性能,我一直觉得这种复杂性不值得
  • 这只会使 async 代码更易于编写,而且我通常在前端使用JavaScript(通常是Angular)来完成所有异步工作,所以我从未认识到 >迫切需要在后端进行异步工作

我经常在工作面试中被问到对asyncasync的理解,我可以回答OK,但是我从来没有完全理解或见证了awaitasync是一段代码中明显更可取的模式的情况。由于我不习惯使用awaitasync,因此我希望能够识别出用例或方案何时呼吁使用await和{{ 1}}。在系统中通常实施的引人注目的用例或场景的良好实践示例是什么?

3 个答案:

答案 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的环境测量设备(例如天气监测仪器)进行通信,并定期进行定期轮询。由于这种轮询是密集型的并且可能是大批量的,因此进行任何不依赖于返回数据的操作(尤其是在使用轮询值期间)进行操作所节省的性能会显着增加。严格来讲,系统中的这种轮询会导致需要并行性,并且除了使用asyncawait操作之外,还可能需要考虑性能。

通常,任何大量和/或高频的实时数据轮询都可能构成代码中async/await 某处的引人注目的用例。