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;
    }
}