“异步任务”成员问题

时间:2013-10-29 19:27:16

标签: c# async-await

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

public async Task Foo()
{
}

您收到警告,因为Fooawait,它将同步运行。它完全等同于public void Foo()吗?为什么返回Task是有效的,但实际上并不创建并返回一个?

同样,以下是做什么的?

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

1 个答案:

答案 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()