async Task<T>() not returning straight away when not using await

86 Views Asked by At

If I have the following function

public async Task<bool> Foo()
{
  // call many async functions
  await Bar1().ConfigureAwait(false);
  await Bar2().ConfigureAwait(false);
  return await Bar3().ConfigureAwait(false);
}

If I call the function above

var t1 = Foo();
var t2 = Foo();
...
await Task.WhenAll(t1, t2).ConfigureAwait(false);

t2 will not execute until t1 completes, (so calling WaitAll is a bit pointless).

But if I call

...
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 and t2 return immediately...

And now if I run ...

...
var t1 = Task.Run( () => Foo());
var t2 = Task.Run( () => Foo());
...
await Task.WhenAll(t1, t2).ConfigureAwait(false);

t1 and t2 also return immediately...

Why does Foo() not return task immediately?

And, should I call Task.Run( () => Foo()) or Task.Run( async () => await Foo().ConfigureAwait(false))

0

There are 0 best solutions below