首页 文章

为什么包含异步lambda的方法不需要是Async本身?

提问于
浏览
7

例如,每当我等待编译器通知我的内容时,包含的方法必须是Async . 为什么这种方式看不到异步lamba?如果ForEach隐藏它,那么是否有一些关于不返回Task对象和ForEach隐式异步void的危险?

public void SaveSome()
    {
        Array.ForEach(Enumerable.Range(0,3).ToArray(), async x =>  await SaveRep());
    }

2 回答

  • 10

    异步lambda只是创建异步委托的一种简单方法 . 没有什么可说的,包含它的方法本身必须做任何异步 - 而lambda表达式中的任何 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 .

  • 2

    你在 async 方法中只能 await 一个 async 方法,但你仍然可以用非异步方法调用它们,就像你're doing above - in this case, it'更多"fire and forget"

相关问题