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