这段代码实际上做了什么?
public async Task Foo()
{
}
您收到警告,因为Foo
不await
,它将同步运行。它完全等同于public void Foo()
吗?为什么返回Task
是有效的,但实际上并不创建并返回一个?
同样,以下是做什么的?
public async Task Foo()
{
await SomeOtherAsyncFn();
}
答案 0 :(得分:8)
当你编写public async Task Foo() {}
时,编译器实际上会通过并创建一个没有状态的状态机,它会立即返回Task
。有很多额外的开销没有用处,这就是为什么有一个编译器警告来避免这种情况。
只需编写就会更简单/更有效:
public Task Foo()
{
return Task.FromResult(true);
}
这将以更简单的方式提供相同的API。
同样,以下是做什么的?
public async Task Foo() { await SomeOtherAsyncFn(); }
这会导致编译器创建一个返回Task
的状态机。当您拨打SomeOtherAsyncFn
时,它会立即致电Foo()
。 Task
完成后,{}返回的SomeOtherAsyncFn()
将被标记为已完成。在这种情况下,状态机还将为您干净地处理异常冒泡,因此如果Task
中出现异常,异常将正确映射到SomeOtherAsyncFn()
。