具有不同执行时间的异步流

bor*_*ris 0 .net c# asynchronous async-await

我有两个API,它们调用相同的服务。

该版本在最昂贵的任务花费的时间内执行。

public async Task<double> Do()
{
    var sw = System.Diagnostics.Stopwatch.StartNew();

    var t1 = _service.Do1();
    var t2 = _service.Do2();

    await t1;
    await t2;

    return sw.Elapsed.TotalMilliseconds;
}
Run Code Online (Sandbox Code Playgroud)

这是每个任务延迟的总和。

public async Task<double> Do()
{
   var sw = System.Diagnostics.Stopwatch.StartNew();

   await _service.Do1();
   await _service.Do2();

   return sw.Elapsed.TotalMilliseconds;
}

internal async Task Do1() => await Task.Delay(5000);
internal async Task Do2() => await Task.Delay(2000);
Run Code Online (Sandbox Code Playgroud)

为什么会这样,实际上是什么情况?

Chr*_*att 6

任务返回“ hot”或已开始。该await关键字相当的字面意思是在这里举行,等待任务完成。这样,当您分别等待每个操作时,它将调用Do1,等待操作完成,然后调用Do2并等待操作完成。

但是,当你只是将它们存储在变量,它调用Do1,然后调用Do2,同时Do1仍在运行。稍后,当您使用await这两个变量时,代码将等待每个变量实际完成一个,但是它们已经在运行。

总而言之,串行和并行运行是有区别的。异步操作可以并行运行,但它们本质上不是并行的:这是两个不同的概念。