加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么包含async lambda的方法不需要是Async本身?

发布时间:2020-12-15 08:24:52 所属栏目:百科 来源:网络整理
导读:例如,每当我等待编译器通知我的内容时,包含的方法必须是Async.为什么这种方式看不到异步lamba?如果ForEach隐藏它,那么是否有一些关于不返回Task对象和ForEach隐式异步void的危险? public void SaveSome() { Array.ForEach(Enumerable.Range(0,3).ToArray()
例如,每当我等待编译器通知我的内容时,包含的方法必须是Async.为什么这种方式看不到异步lamba?如果ForEach隐藏它,那么是否有一些关于不返回Task对象和ForEach隐式异步void的危险?
public void SaveSome()
    {
        Array.ForEach(Enumerable.Range(0,3).ToArray(),async x =>  await SaveRep());
    }

解决方法

异步lambda只是创建异步委托的一种简单方法.没有什么可说的,包含它的方法本身必须做任何异步 – 并且lambda表达式中的任何await表达式都不会使包含方法等待(除非它正在等待一个恰好依赖于委托的任务,当然).

基本上lambda表达式表示一些异步代码 – 它不执行异步代码本身…所以包含方法不一定异步执行.

是的,你给出的例子是滥用异步lambdas – 但是使方法异步并不会改善问题,而这只会产生误导.

编辑:作为另一种思考方式,请考虑重构原始代码:

public void SaveSome()
{
    Action<int> action = SaveRepAsync;
    Array.ForEach(Enumerable.Range(0,action);
}

private static async void SaveRepAsync(int x)
{
    await SaveRep();
}

SaveSome方法没有任何异步 – 只有SaveRepAsync方法…这就是需要async修饰符的东西.这实际上只是对代码的一种微小重构(编译器将有效地进行重构).如果你想让每个包含async lambda的方法都有async修饰符,那就像在上面的代码中说的那样,SaveSome也应该有修饰符……这就没有意义了,IMO.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读