c# - 当我不是该方法的作者时,如何避免 async void lambda?

标签 c# async-await

我已经阅读了有关为什么应该避免 async void 方法和 async void lambda 的内容。但是,当我不是采用 lambda 的方法的作者时,我仍然不清楚如何避免它们。

例如,this blog postthis 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 的示例,它接受 ActionFunc : 1

关于c# - 当我不是该方法的作者时,如何避免 async void lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70295163/

相关文章:

c# - 如何检查字符串是否具有正确的html语法

c# - 删除 Highcharts 图表上条形下方的类别文本

c# - 具有多个存储库的依赖注入(inject)

c# - 如何触发(不是避免!)HttpClient 死锁

c# - 我如何知道异步方法调用是否更改了调用者的上下文?

mvvm - 从数据绑定(bind)属性 setter 中调用异步方法的正确方法?

java - 根据搜索模式列出亚马逊 S3 文件夹下具有文件名的所有 xml 文件

c# - 为什么我得到 Win32Exception : The operation completed successfully?

JavaScript:Promise.All() 和 Async/Await 以及 Map()

c# - 从 WCF 服务调用异步方法