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()
相比,你可以存檔一點加速。
注意 exceptions
:Exceptions
會在第一次播出時播放出來。例:
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;
}
}