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

Mon*_*mer 1 c# async-await

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

我有两个长时间运行的CPU绑定操作(JobAJobB)。两者都不与GUI交互。不同于Task.FromResult在await表达式中立即完成操作,我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();
}
Run Code Online (Sandbox Code Playgroud)

在我的理解,包装JobBTask.Run,因为持续已保证在非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());
}
Run Code Online (Sandbox Code Playgroud)

Exception异步中的行为有点棘手,所以我问这个问题,因为我想知道异常发生时进行选区是否有风险。如果没有这种风险,我将删除此问题。

Ste*_*ary 5

我的Task.Run(()=> JobA())。ConfigureAwait(false)将控制权返回给调用者,并导致继续在非GUI线程中执行(因为ConfigureAwait(false))

真?你确定吗

的一个有趣方面await是,如果可能的话,它的行为是同步的。因此,如果该任务在时间await检查之前已经完成,await则将继续同步运行。在这种情况下,ConfigureAwait无效。

值得注意的是,当您使用不同的计算机具有不同的CPU速度,可用内存或缓存行为时,可能会发生这种情况。掌握了墨菲定律,您最终遇到了无法复制的生产问题,这总是很有趣的。

因此,我从不依赖于ConfigureAwait(false)保证任何代码在线程池线程上运行。那Task.Run是为了什么 对于您发布的简单案例,您可以在内完成一项工作Task.Runawait Task.Run(() => { JobA(); JobB(); });