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

Jay*_*uzi 35 c# async-await

在任务返回异步方法结束时,如果我调用另一个异步方法,我可以使用await它或return它的任务.每个的后果是什么?

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

    async Task BarAsync()
    {
        await BazAsync(); // Option B
    }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 33

如果声明方法本身,则无法返回任务async- 因此这不起作用,例如:

async Task BarAsync()
{
    return BazAsync(); // Invalid!
}
Run Code Online (Sandbox Code Playgroud)

那将需要返回类型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();
}
Run Code Online (Sandbox Code Playgroud)

  • `如果你的方法只做了少量的工作然后只调用一个异步方法`特别是,这是重载`async`方法的常见模式(例如,`BarAsync()`和`BarAsync(CancellationToken)` . (2认同)
  • @StephenCleary:的确如此-同样,同步验证之后返回“真实”异步任务。将进行编辑以表明这一点。 (2认同)