将异步 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 将异步执行。
async
和 await
仅适用于方法定义。
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);
我有一个执行器方法:
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 将异步执行。
async
和 await
仅适用于方法定义。
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);