我已经阅读了有关为什么应该避免 async void 方法和 async void lambda 的内容。但是,当我不是采用 lambda 的方法的作者时,我仍然不清楚如何避免它们。
例如,this blog post和 this one两者都清楚地解释了问题。但是,他们提供的解决方案是修改方法(第二个链接中的 Time
方法)以接受 Func
而不是 Action
。
当您是编写方法的人时,这一切都很好。如果情况并非如此,你会怎么做?例如,考虑这段毫无意义的代码......
new List<int>()
.ForEach(async n => {
await Task.Delay(1);
});
Resharper 警告您应避免在委托(delegate)类型返回 void 时使用异步 lambda。我该如何避免这种情况?
另一个例子是......
var modifiedCollection = someCollection
.Select(async x => await DoSomething(x));
我不是 Linq 的作者,因此无法更改 Select 来接受 Func
,那么如何避免该问题?
感谢您提供的任何说明。
最佳答案
简短的回答是,避免它的唯一方法就是不使用它。
List<T>.ForEach()
只接受 Action
,所以这是一个问题,但您可以轻松地将其替换为常规 foreach
循环。
Enumerable.Select()
需要 Func
,所以这实际上并不是一个问题。
如果一个方法同时具有 Action
的重载和Func
,然后Func
当它被赋予 async lambda 时将是首选。将光标放在方法上可以看到正在使用哪个重载。工具提示将向您显示。
这是一个带有 Task.Run
的示例,它接受 Action
或Func
:
关于c# - 当我不是该方法的作者时,如何避免 async void lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70295163/