![](/img/trans.png)
[英]Is “ return await Task.Run(() => PartialView()) ” necessary?
[英]Is it necessary to wrap the continuation that will be in non-GUI thread with Task.Run?
这个问题是出于学习目的。 我不确定要开发任何东西。
我有两个长时间运行的CPU绑定操作( JobA
和JobB
)。 两者都不与GUI交互。 与Task.FromResult
在等待表达式处立即完成不同,我的Task.Run(()=>JobA()).ConfigureAwait(false)
将控制权返回给调用方,并导致继续在非GUI线程中执行(因为的ConfigureAwait(false)
)。
static void JobA()
{
for (int i = 0; i < int.MaxValue; i++) ;
}
static void JobB()
{
for (int i = 0; i < int.MaxValue; i++) ;
}
private static async Task Async()
{
await Task.Run(()=>JobA()).ConfigureAwait(false);
JobB();
//await Task.Run(() => JobB());
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
await Async();
}
以我的理解, Task.Run
像下面第二种情况那样用Task.Run
包装JobB
,因为已经保证继续可以在非GUI线程中运行。
private static async Task Async()
{
await Task.Run(()=>JobA()).ConfigureAwait(false);
JobB();
}
private static async Task Async()
{
await Task.Run(()=>JobA()).ConfigureAwait(false);
await Task.Run(() => JobB());
}
异步中的Exception
行为有些棘手,所以我问这个问题,因为我想知道异常发生时进行选区是否有风险。 如果没有这种风险,我将删除此问题。
我的Task.Run(()=> JobA())。ConfigureAwait(false)将控制权返回给调用者,并导致继续在非GUI线程中执行(因为ConfigureAwait(false))
真? 你确定吗
await
一个有趣方面是,如果可能的话,它会同步运行。 因此,如果任务在await
检查时已经完成,则await
将继续同步运行。 在这种情况下, ConfigureAwait
无效。
值得注意的是,当您使用不同的计算机具有不同的CPU速度,可用内存或缓存行为时,可能会发生这种情况。 掌握了墨菲定律,您最终遇到了无法复制的生产问题,这总是很有趣的。
因此,我从不依赖ConfigureAwait(false)
来确保任何代码正在线程池线程上运行。 那就是Task.Run
目的。 对于您发布的简单案例,您可以在Task.Run
完成一项工作: await Task.Run(() => { JobA(); JobB(); });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.