这段代码实际上做了什么?
public async Task Foo()
{
}
你会得到一个警告,因为Foo
它没有await
,它将同步运行。是否完全等同于public void Foo()
?为什么返回是有效的Task
,但实际上不是创建和返回一个?
同样,以下是做什么的?
public async Task Foo()
{
await SomeOtherAsyncFn();
}
这段代码实际上做了什么?
public async Task Foo()
{
}
你会得到一个警告,因为Foo
它没有await
,它将同步运行。是否完全等同于public void Foo()
?为什么返回是有效的Task
,但实际上不是创建和返回一个?
同样,以下是做什么的?
public async Task Foo()
{
await SomeOtherAsyncFn();
}
编写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()
.