Task 对象

如果你拿走 async-await 关键字,Task 对象就像任何其他对象一样。

考虑这个例子:

public async Task DoStuffAsync()
{
    await WaitAsync();
    await WaitDirectlyAsync();
}

private async Task WaitAsync()
{
    await Task.Delay(1000);
}

private Task WaitDirectlyAsync()
{
    return Task.Delay(1000);
}

这两种方法的区别很简单:

  • WaitAsync 等待 Task.Delay 完成,然后返回。
  • WaitDirectlyAsync 不等待,只是立即返回 Task 对象。

每次使用 await 关键字时,编译器都会生成处理它的代码(以及它等待的 Task 对象)。

  • 在调用 await WaitAsync() 时,这会发生两次:一次在调用方法中,一次在方法本身中。
  • 在调用 await WaitDirectlyAsync 时,这只发生一次(在调用方法中)。因此,与 await WaitAsync() 相比,你可以存档一点加速。

注意 exceptionsExceptions 会在第一次播出时播放出来。例:

private async Task WaitAsync()
{
    try
    {
        await Task.Delay(1000);
    }
    catch (Exception ex)
    {
        //this might execute
        throw;
    }
}

private Task WaitDirectlyAsync()
{
    try
    {
        return Task.Delay(1000);
    }
    catch (Exception ex)
    {
        //this code will never execute!
        throw;
    }
}