"异步任务"成员问题

mos*_*ald 1 c# async-await

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

public async Task Foo()
{
}
Run Code Online (Sandbox Code Playgroud)

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

同样,以下是做什么的?

public async Task Foo()
{
    await SomeOtherAsyncFn();
}
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 8

当你编写时public async Task Foo() {},编译器实际上会通过并创建一个没有状态的状态机,它会立即返回Task.有很多额外的开销没有任何用处,这就是为什么有一个编译器警告来避免这种情况.

只写:它会更简单/更有效:

public Task Foo()
{
    return Task.FromResult(true);
}
Run Code Online (Sandbox Code Playgroud)

这将以更简单的方式提供相同的API.

同样,以下是做什么的?

public async Task Foo()
{
    await SomeOtherAsyncFn();
}
Run Code Online (Sandbox Code Playgroud)

这会导致编译器创建一个将返回a的状态机Task.它会SomeOtherAsyncFn在你打电话时立即打电话Foo().Task一旦SomeOtherAsyncFn()完成,返回的标记将被标记为已完成.在这种情况下,状态机还将为您干净地处理异常冒泡,因此Task如果出现异常,异常将被映射到正确的异常SomeOtherAsyncFn().