I have this construct in my main()
, which creates
var tasks = new List<Task>();
var t = Task.Factory.StartNew(
async () =>
{
Foo.Fim();
await Foo.DoBar();
});
//DoBar not completed
t.Wait();
//Foo.Fim() done, Foo.DoBar should be but isn't
However, when I .Wait
for t, it won't wait for the call to DoBar()
to complete.
How do I get it to actually wait?
It seems like I get desired functionality by
Unwrap()
ing the task. I'm not quite sure I get the reasoning behind this, but I suppose it works.edit: I've looked for ddescription of
Unwrap()
:Creates a proxy Task that represents the asynchronous operation of a Task<Task<T>>
I thought this was traditionally what the task did, but if I need to call unwrap I suppose that's fine.I faced similar issue recently and figured out that all you need to do is have
DoBar()
return some value and use .Result instead of wait.This will wait for
func
to return its output and assign it to val.It's discouraged to use
Task.Factory.StartNew
withasync-await
, you should be usingTask.Run
instead:The
Task.Factory.StartNew
api was built before the Task-based Asynchronous Pattern (TAP) andasync-await
. It will returnTask<Task>
because you are starting a task with a lambda expression which happens to be async and so returns a task.Unwrap
will extract the inner task, butTask.Run
will implicitly do that for you.For a deeper comparison, there's always a relevant Stephen Toub article: Task.Run vs Task.Factory.StartNew