例如,每当我等待编译器通知我的内容时,包含的方法必须是Async . 为什么这种方式看不到异步lamba?如果ForEach隐藏它,那么是否有一些关于不返回Task对象和ForEach隐式异步void的危险?
public void SaveSome() { Array.ForEach(Enumerable.Range(0,3).ToArray(), async x => await SaveRep()); }
异步lambda只是创建异步委托的一种简单方法 . 没有什么可说的,包含它的方法本身必须做任何异步 - 而lambda表达式中的任何 await 表达式都在等待一个恰好依赖于委托的任务 .
await
基本上lambda表达式表示一些异步代码 - 它不执行异步代码本身...所以包含方法不一定异步执行 .
是的,你给出的例子是滥用异步lambdas - 但是使方法异步并不会改善问题,而这只会产生误导 .
编辑:作为另一种思考方式,请考虑重构原始代码:
public void SaveSome() { Action<int> action = SaveRepAsync; Array.ForEach(Enumerable.Range(0,3).ToArray(), action); } private static async void SaveRepAsync(int x) { await SaveRep(); }
SaveSome 方法没有任何异步 - 只有 SaveRepAsync 方法...这就是需要 async 修饰符的东西 . 这实际上只是对代码的一种微小重构(编译器将有效地进行重构) . 如果你想让每个包含async lambda的方法都有async修饰符,那就像在上面的代码中说的那样, SaveSome 也应该有修饰符......这没有任何意义,IMO .
SaveSome
SaveRepAsync
async
你在 async 方法中只能 await 一个 async 方法,但你仍然可以用非异步方法调用它们,就像你're doing above - in this case, it'更多"fire and forget"
2 回答
异步lambda只是创建异步委托的一种简单方法 . 没有什么可说的,包含它的方法本身必须做任何异步 - 而lambda表达式中的任何
await
表达式都在等待一个恰好依赖于委托的任务 .基本上lambda表达式表示一些异步代码 - 它不执行异步代码本身...所以包含方法不一定异步执行 .
是的,你给出的例子是滥用异步lambdas - 但是使方法异步并不会改善问题,而这只会产生误导 .
编辑:作为另一种思考方式,请考虑重构原始代码:
SaveSome
方法没有任何异步 - 只有SaveRepAsync
方法...这就是需要async
修饰符的东西 . 这实际上只是对代码的一种微小重构(编译器将有效地进行重构) . 如果你想让每个包含async lambda的方法都有async修饰符,那就像在上面的代码中说的那样,SaveSome
也应该有修饰符......这没有任何意义,IMO .你在
async
方法中只能await
一个async
方法,但你仍然可以用非异步方法调用它们,就像你're doing above - in this case, it'更多"fire and forget"