【问题标题】:Trying to understand async/await in c#试图理解 c# 中的 async/await
【发布时间】:2016-04-03 13:30:16
【问题描述】:

我使用 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 日志的结果分析表明,这两个值的处理方式与内联处理情况完全相同。在这两种情况下,总时间也是相同的。为什么会这样?

【问题讨论】:

  • 附带说明,Task.Factory.StartNew 是一个危险的 API。请改用Task.Run
  • 尽量避免异步 void 结构。在this 页面上查找更多信息。
  • @JeroenHeier 为您的反馈干杯。会看看

标签: c# asynchronous parallel-processing async-await


【解决方案1】:

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 它可以将线程的控制权交给另一个请求,直到前一个任务的长时间运行请求完成然后当它完成时,将它的控制权交还给它。

【讨论】:

  • 不用担心,很高兴它有帮助!
猜你喜欢
  • 2019-03-04
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 2017-11-14
  • 2020-03-25
相关资源
最近更新 更多