是否需要异步回调?

时间:2017-02-10 06:08:48

标签: c# asynchronous async-await

如果使用以下方法进行回调:

public async Task MethodWithCallback(Action callback)
{
  await _myService.SomeExcitingAsync(); 
  callback();
}

是否安全/建议传递异步回调,如:

await MethodWithCallback(async () =>
  {
    await _myOtherService.AnotherExcitingAsync();
  });

或者是否建议我提供以下方法的异步版本?这有什么不同吗?

public async Task MethodWithCallback(Func<Task> callback) {
  await _myService.SomeExcitingAsync(); 
  await callback();
}

1 个答案:

答案 0 :(得分:2)

<强> TL;博士

如果回调代码是异步的,请让委托返回Task

虽然您可以将异步lambda分配给Action,但它可能没有您期望的行为。它创建了等同于async void方法的东西。

结果是,虽然lambda是异步的,但是委托的调用者将无法等待它完成,并且无法看到它的结果。任何未被捕获的例外都将丢失。

虽然C#允许这样做,并且在极少数情况下考虑到这些警告可能会非常谨慎地编写代码,但一般的经验法则是永远不要这样做。