Search code examples
c#.nettask-parallel-librarytaskasync-await

Waiting for async/await inside a task


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?


Solution

  • 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