在返回任务的异步方法的最后,如果我调用另一个异步方法,则可以使用await它或return它的任务。各自的后果是什么?
await
return
Task FooAsync() { return BazAsync(); // Option A } async Task BarAsync() { await BazAsync(); // Option B }
如果方法本身被声明为,则无法返回任务async-这样就无法工作,例如:
async
async Task BarAsync() { return BazAsync(); // Invalid! }
这将要求返回类型为Task<Task>。
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(); }