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's discouraged to use Task.Factory.StartNew
with async-await
, you should be using Task.Run
instead:
var t = Task.Run(
async () =>
{
Foo.Fim();
await Foo.DoBar();
});
The Task.Factory.StartNew
api was built before the Task-based Asynchronous Pattern (TAP) and async-await
. It will return Task<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, but Task.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
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.
var t = Task.Factory.StartNew(
async () =>
{
Foo.Fim();
await Foo.DoBar();
}).Unwrap();
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With