【发布时间】:2026-01-05 08:45:01
【问题描述】:
所以我在 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 也是如此吗?
【问题讨论】:
-
也许这个(及其相关链接)作者是 Stephen Cleary,*.com/questions/32591462/…
-
Task.Result很少是正确的选择,以至于我发现自己在这里质疑它是否真的是“正确使用”...... -
@TheGeneral 我不确定它是否正确。他的建议是避免这种情况,但我认为我有一个有效的用途。我在
Task方法中添加了一些上下文 -
StartNew示例应使用Unwrap,而不是Result。另外,我强烈建议始终将TaskScheduler传递给StartNew。或者,更好的是,只需使用Task.Run,它会为您完成这两项工作。
标签: c# async-await task