将异步 lambda 传递给需要 Func<Task<T>> 的函数时是否需要异步 lambda?

Is async lambda needed when passing it to a function that expects Func<Task<T>>?

我有一个执行器方法:

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 将异步执行。

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);