为什么先将多个任务存储在 var 中然后等待它们会产生影响? [重复]

问题描述 投票:0回答:2

鉴于此代码...为什么 Main1() 需要约 1 秒,而 Main2() 仅需要 500 毫秒?

为什么先将任务存储在变量中然后等待会有什么不同?

async Task Main1()
{
    await DoStuff(1);
    await DoStuff(2);
}

async Task Main2()
{
    var t1 = DoStuff(1);
    var t2 = DoStuff(2);
    await t1;
    await t2;
}

async Task DoStuff(int number)
{
    await Task.Delay(500);
    Console.WriteLine(number);
}
c# concurrency async-await
2个回答
6
投票

这与是否将任务存储在变量中无关,而是与何时启动任务有关。在这种情况下:

async Task Main1()
{
    await DoStuff(1); // Task 1
    await DoStuff(2); // Task 2
}

等待任务 1 完成后开始任务 2。请注意,调用 DoStuff

 
会启动任务,然后 await
 
等待 等待任务完成。

在这种情况下:

async Task Main2() { var t1 = DoStuff(1); // Task 1 var t2 = DoStuff(2); // Task 2 await t1; await t2; }
您无需等待任务 1 完成就启动任务 2,因此它们是同时执行的。 

DoStuff(2)

 不会等待 
DoStuff(1)
 完成后再运行。

如果您这样做:

async Task Main3() { var t1 = DoStuff(1); await t1; var t2 = DoStuff(2); await t2; }
您会得到与 

Main1

 相同的行为。这表明你是否将任务放入变量中并不重要。


3
投票
在 Main1 中,

DoStuff(2)

 仅当 
DoStuff(1)
 完成后才开始。
但在 Main2 中,t1 和 t2 任务几乎同时启动并同时处理。

© www.soinside.com 2019 - 2024. All rights reserved.