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