正确等待Task.Run与异步lambda表达式

时间:2019-07-09 08:57:24

标签: c# async-await task

所以我在 Task.Run 中包装了一个异步方法,如下所示:

//SynchronisationContext = UI Thread
await Task.Run(async => 
{
    for (int i = 0; i < 100; i++)
    {
       var res = ComplicatedCalulation(); //Takes about 1 second
       await ThirdPartyLib.WriteToDatabase(res);
    }
});

在上面的代码中 await 是等待异步lambda代码还是只是等待Task被启动(即立即返回)

我知道Task.Factory.StartNew的正确用法是

await Task.Factory.StartNew<Task>(async => await MyAsyncMethod()).Result

Task.Run 也是这样吗?

1 个答案:

答案 0 :(得分:0)

您的代码将使用任务机制等到计算结束。这不会阻塞您的线程,但是直到完成循环中的所有操作之后,它才会执行代码。

public static async Task Test()
{
    await Task.Run(async () => 
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(TimeSpan.FromSeconds(1));
            Console.WriteLine($"inside {i}");
        }
    });
    Console.WriteLine("Done");
}

将给出以下输出:

inside 0
inside 1
inside 2
inside 3
inside 4
inside 5
inside 6
inside 7
inside 8
inside 9
Done