一尘不染

在异步方法的结尾,我应该返回还是等待?

c#

在返回任务的异步方法的最后,如果我调用另一个异步方法,则可以使用await它或return它的任务。各自的后果是什么?

    Task FooAsync()
    {
        return BazAsync();  // Option A
    }

    async Task BarAsync()
    {
        await BazAsync(); // Option B
    }

阅读 276

收藏
2020-05-19

共1个答案

一尘不染

如果方法本身被声明为,则无法返回任务async-这样就无法工作,例如:

async Task BarAsync()
{
    return BazAsync(); // Invalid!
}

这将要求返回类型为Task<Task>

如果您的方法 执行少量工作,然后 调用一个异步方法,则您的第一个选择很好,这意味着所涉及的任务更少。您应该知道, 同步
方法中引发的任何异常都将 同步 传递-实际上,这就是我更喜欢处理参数验证的方式。

这也是实现重载(例如通过取消令牌)的常见模式。

请注意,如果您需要更改以等待其他内容,则需要使其成为异步方法。例如:

// Version 1:
Task BarAsync()
{
    // No need to gronkle yet...
    return BazAsync();
}

// Oops, for version 2 I need to do some more work...
async Task BarAsync()
{
    int gronkle = await GronkleAsync();
    // Do something with gronkle

    // Now we have to await BazAsync as we're now in an async method
    await BazAsync();
}
2020-05-19