async Task<T>() не сразу возвращается, когда не используется await
Если у меня есть следующая функция
public async Task<bool> Foo()
{
// call many async functions
await Bar1().ConfigureAwait(false);
await Bar2().ConfigureAwait(false);
return await Bar3().ConfigureAwait(false);
}
Если я вызову функцию выше
var t1 = Foo();
var t2 = Foo();
...
await Task.WhenAll(t1, t2).ConfigureAwait(false);
t2 не будет выполняться, пока не завершится t1 (так называемый WaitAll
немного бессмысленно).
Но если я позвоню
...
var t1 = Task.Run( async () => await Foo().ConfigureAwait(false));
var t2 = Task.Run( async () => await Foo().ConfigureAwait(false));
...
await Task.WhenAll(t1, t2).ConfigureAwait(false);
t1 и t2 возвращаются немедленно...
И теперь, если я бегу...
...
var t1 = Task.Run( () => Foo());
var t2 = Task.Run( () => Foo());
...
await Task.WhenAll(t1, t2).ConfigureAwait(false);
t1 и t2 также немедленно возвращаются...
Почему Foo() не возвращает задачу сразу?
И я должен позвонить Task.Run( () => Foo())
или же Task.Run( async () => await Foo().ConfigureAwait(false))