繁体   English   中英

试图了解C#中的异步/等待

[英]Trying to understand async/await in c#

我已经使用async关键字编写了一种方法,但是无法理解它的结果以及它不能真正起作用的原因:

static async void ExampleWithValueReturned_Async(Stopwatch sw, SlowOperation opr1, SlowOperation opr2)
{
    Console.WriteLine("Started processing ASYNC. Start: {0}", sw.Elapsed);
    sw.Start();

    Console.WriteLine("2 Step0: {0}", sw.Elapsed);
    var sum1_2 = await Task<double>.Factory.StartNew(() => opr1.PerformSlowOperation(1, true));
    Console.WriteLine("2 Step1: {0}", sw.Elapsed);
    var sum2_2 = await Task<double>.Factory.StartNew(() => opr2.PerformSlowOperation(1, true));
    Console.WriteLine("2 Step2: {0}", sw.Elapsed);

    Console.WriteLine("Operation 1 gave sum: {0}", sum1_2.ToString("0.##"));
    Console.WriteLine("Operation 2 gave sum: {0}", sum2_2.ToString("0.##"));
    Console.WriteLine("Stopped processing ASYNC. Stop: {0}", sw.Elapsed);
    sw.Stop();

    sw.Reset();
    Console.WriteLine("");
}

我期望它的运行速度比内联处理快两倍,因为PerformSlowOperation可以并行运行。 我的期望是将同时生成sum1_2和sum2_2,而基于Stopwatch日志对结果的分析表明,这两个值的处理方式与内联处理情况完全相同。 两种情况下的总时间也相同。 为什么会这样呢?

C# await关键字完全按照单词的意思执行操作,它在继续执行下一行之前等待函数完成执行。 如果您未使用await关键字,则它将在后台运行并继续执行其余代码,但是这不允许您对结果执行任何操作。

要并行运行这两个任务,您需要明确声明要等待所有任务完成才能继续,而不是仅等待每个任务。

Task t1 = Task<double>.Factory.StartNew(() => opr1.PerformSlowOperation(1, true));
Task t2 = Task<double>.Factory.StartNew(() => opr2.PerformSlowOperation(1, true));
await Task.WhenAll(t1,t2);
var sum1_2 = t1.Result;
var sum2_2 = t2.Result;

上面的代码将等到两者都完成后再并行运行,然后再继续其余的代码。

关键字存在的原因不是要启用并行任务,而是要使应用程序在执行其余代码之前等待单个异步方法完成。 在ASP.NET中,长时间运行的任务会浪费线程,这非常有用。使用await告诉ASP.NET,它可以将线程的控制权交给另一个请求,直到上一个任务的长时间运行的请求完成为止,然后它确实完成了对线程的控制权。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM