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

0 ответов

Другие вопросы по тегам