1

这段代码实际上做了什么?

public async Task Foo()
{
}

你会得到一个警告,因为Foo它没有await,它将同步运行。是否完全等同于public void Foo()?为什么返回是有效的Task,但实际上不是创建和返回一个?

同样,以下是做什么的?

public async Task Foo()
{
    await SomeOtherAsyncFn();
}
4

1 回答 1

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().

于 2013-10-29T19:31:31.220 回答