如果使用以下方法进行回调:
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();
}
答案 0 :(得分:2)
<强> TL;博士强>
如果回调代码是异步的,请让委托返回Task
。
长
虽然您可以将异步lambda分配给Action
,但它可能没有您期望的行为。它创建了等同于async void
方法的东西。
结果是,虽然lambda是异步的,但是委托的调用者将无法等待它完成,并且无法看到它的结果。任何未被捕获的例外都将丢失。
虽然C#允许这样做,并且在极少数情况下考虑到这些警告可能会非常谨慎地编写代码,但一般的经验法则是永远不要这样做。