【问题标题】:Is async lambda needed when passing it to a function that expects Func<Task<T>>?将异步 lambda 传递给需要 Func<Task<T>> 的函数时是否需要它?
【发布时间】:2020-03-30 14:31:17
【问题描述】:

我有一个执行器方法:

public static async Task<T> ExecuteAsync(Func<Task<T>> method)
{
    await method();
}

同时调用它时

await ExecuteAsync( () => obj.MethodAsync());

await ExecuteAsync( async () => await obj.MethodAsync());

似乎工作得很好,并在大致相同的时间内完成,同时产生大致相同数量的线程。我的理解是,在第一种情况下,方法将在 lambda 内部同步执行,而 lambda 将异步执行,而在第二个示例中,方法和 lambda 都将异步执行。

【问题讨论】:

标签: c# asynchronous lambda async-await delegates


【解决方案1】:

asyncawait 仅适用于方法定义。

async 表示编译器会为方法生成状态机。

await表示编译器会生成代码同步等待invoke方法完成。

ExecuteAsync(() => obj.MethodAsync())

翻译成:

[CompilerGenerated]
private sealed class <>c__DisplayClass0_0
{
    public C<T> obj;

    internal Task<T> <M>b__0()
    {
        return obj.MethodAsync();
    }
}

// ...

<>c__DisplayClass0_0 <>c__DisplayClass0_ = new <>c__DisplayClass0_0();
<>c__DisplayClass0_.obj = obj;
ExecuteAsync(new Func<Task<T>>(<>c__DisplayClass0_.<M>b__0));

另一方面,

ExecuteAsync( async () => await obj.MethodAsync())

转化为涉及嵌套状态机的更复杂的东西。

尝试sharplab.io 以查看降低的代码。

事实上,最简单的版本是:

await ExecuteAsync(obj.MethodAsync);

【讨论】:

    猜你喜欢
    • 2017-11-12
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2015-09-24
    相关资源
    最近更新 更多