代码检查:避免在委托类型返回 'void' 时使用 'async' lambda
此检查报告了在异步上下文中使用 void 委托类型的情况。 这里的问题与 async void 方法的问题相同,但更难发现。
为了说明问题,让我们考虑以下方法:
public String RunThisAction(Action doSomething)
{
doSomething();
return "OK";
}
其 doSomething 参数是 操作 委托类型,并返回 void。 在同步上下文中使用此方法是安全的,例如,
RunThisAction(() => Console.WriteLine("Test"));
但在异步上下文中使用,例如,
RunThisAction(async () => await Task.Delay(1000));
// or
RunThisAction(async delegate { await Task.Delay(1000); });
可能会导致运行时问题。 以下是一个示例:假设我们决定扩展 lambda 以抛出一个异常:
RunThisAction(async () =>
{
await Task.Delay(1000);
throw new NotImplementedException();
});
由于我们的 doSomething 委托是 void ,异常将永远不会影响调用线程,也不会被 捕捉 捕获。
最后修改日期: 2025年 9月 26日