Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#异步和等待-什么是引人注目的用例?_C#_Asynchronous_Async Await - Fatal编程技术网

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

C#异步和等待-什么是引人注目的用例?,c#,asynchronous,async-await,C#,Asynchronous,Async Await,过去,我在C#中详细地回顾了async和await,包括回顾了我在该主题中发现的所有堆栈溢出问题,但我从未在代码中实现async和await,原因如下: 我对主要性能优势的理解是,如果您有一个长时间运行的流程,然后是执行耗时的逻辑,然后是消耗第一个长时间运行的流程返回的内容。我从未遇到过这种情况。我遇到过这样的场景:初始长时间运行的流程和依赖于长时间运行的流程之间的逻辑最小,引入await和async来实现较小的性能节省是不够的。引入异步调用在执行顺序方面引入了少量的复杂性,对于较小的性能提升

过去,我在C#中详细地回顾了
async
await
,包括回顾了我在该主题中发现的所有堆栈溢出问题,但我从未在代码中实现
async
await
,原因如下:

  • 我对主要性能优势的理解是,如果您有一个长时间运行的流程,然后是执行耗时的逻辑,然后是消耗第一个长时间运行的流程返回的内容。我从未遇到过这种情况。我遇到过这样的场景:初始长时间运行的流程和依赖于长时间运行的流程之间的逻辑最小,引入
    await
    async
    来实现较小的性能节省是不够的。引入异步调用在执行顺序方面引入了少量的复杂性,对于较小的性能提升,我一直认为这种复杂性不值得
  • 它只会使异步代码更容易编写,而且我通常在前端使用JavaScript(通常是角度的)完成所有异步工作,因此我从未意识到后端对异步工作的迫切需求

在工作面试中,经常有人问我对
async
await
的理解,我可以回答这个问题,但我从来没有完全理解或亲眼目睹过
async
await
显然是一段代码中更可取的模式。由于我没有使用
async
await
的习惯,我希望能够识别何时有用例或场景需要使用
async
await
。系统中常用的引人注目的用例或场景的一个很好的实际例子是什么?

一个很好的例子是将数据保存到文件或数据库中

下面是一个例子:

    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实现:

感谢@David Haim提示阅读异步IO-。关键是,在一个操作将被执行多次的系统中,计算异步/等待的累积性能会有显著的提高是很重要的(即使它只在方法级别上产生少量的性能提高)

我目前正在从事的项目是一个非常好的例子,说明了在哪些方面需要实现
async/await
。该系统与直接连接到PC的环境测量设备(如天气监测仪器)进行通信,以便定期进行轮询。由于这种轮询是密集的,并且可能是高容量的,因此执行任何不依赖于返回数据的操作(特别是在使用轮询值期间)所节省的性能显著增加。严格来说,系统中的这种轮询类型推断出需要并行性,除了使用
异步
等待
操作外,还可能需要考虑性能


一般来说,任何高容量和/或高频率的实时数据轮询都可能构成代码中某个地方的
async/await
的一个引人注目的用例。

我认为人们似乎忘记了,当与
I/O完成端口一起使用时,异步I/O(IOCP)
async/await
可以很好地封装,不使用昂贵的线程,因此允许您以最小的线程开销每秒执行更多的I/O操作。看

纯I/O虽然是异步的,但确实需要线程等待Windows文件句柄,因此的效率不如IOCP

所有的I/O本质上都是异步的,像Stream.Read()这样的同步方法是一种逃避


那是不对的。还有阻塞I/O。你很快就会知道你正在使用阻塞I/O,因为你的线程使用率飙升。e、 g.阻止HAPIHL7.NET库中网络I/O操作的I/O。

想到异步IO。能够在web服务器中异步处理请求可能是原因1。但这被总结为异步IO,正如前面提到的,可能值得一读<代码>对于小的性能提升,我一直觉得这种复杂性不值得
在某些环境下(如大型网站),它肯定值得。我们一定读过完全不同的东西。。。询问真实场景如何“边缘化”要求验证倾向性意见?感谢@bommelding,但是在阅读异步IO的定义时,我支持我对性能优势的理解是正确的。轮询不是自动异步的。这里讲的是并行性。没有阻塞I/O。只有在等待回调时阻塞线程的API。@HenkHolterman您错了。实际上,
FILE\u FLAG\u OVERLAPPED
是可选的,不是强制性的。应用程序使用过多的同步调用和一个很小的缓冲区,从而导致高CPU负载,这是毫无疑问的。"". 再一次,我告诉你.NET库就是这样HAPIHL7@HenkHolterman这在当时甚至是一个问题,因为使用软件流控制而不是硬件流控制的串行通信效率低下,这给CPU带来了太多的压力,并限制了较高的吞吐量