鉴于此代码...为什么 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);
}
这与是否将任务存储在变量中无关,而是与何时启动任务有关。在这种情况下:
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
相同的行为。这表明你是否将任务放入变量中并不重要。
DoStuff(2)
仅当
DoStuff(1)
完成后才开始。 但在 Main2 中,t1 和 t2 任务几乎同时启动并同时处理。