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