所以我在 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 也是这样吗?
答案 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