这个问题是出于学习目的。我不确定要开发任何东西。
我有两个长时间运行的CPU绑定操作(JobA和JobB)。两者都不与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)
在我的理解,包装JobB带Task.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异步中的行为有点棘手,所以我问这个问题,因为我想知道异常发生时进行选区是否有风险。如果没有这种风险,我将删除此问题。
我的Task.Run(()=> JobA())。ConfigureAwait(false)将控制权返回给调用者,并导致继续在非GUI线程中执行(因为ConfigureAwait(false))
真?你确定吗
的一个有趣方面await是,如果可能的话,它的行为是同步的。因此,如果该任务在时间await检查之前已经完成,await则将继续同步运行。在这种情况下,ConfigureAwait无效。
值得注意的是,当您使用不同的计算机具有不同的CPU速度,可用内存或缓存行为时,可能会发生这种情况。掌握了墨菲定律,您最终遇到了无法复制的生产问题,这总是很有趣的。
因此,我从不依赖于ConfigureAwait(false)保证任何代码在线程池线程上运行。那Task.Run是为了什么 对于您发布的简单案例,您可以在内完成一项工作Task.Run:await Task.Run(() => { JobA(); JobB(); });