繁体   English   中英

是否有必要用Task.Run包装在非GUI线程中的延续?

[英]Is it necessary to wrap the continuation that will be in non-GUI thread with Task.Run?

这个问题是出于学习目的。 我不确定要开发任何东西。

我有两个长时间运行的CPU绑定操作( JobAJobB )。 两者都不与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM