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