首页 > 解决方案 > 传递给 Task.WaitAll() 的任务会在不同的上下文中运行吗?

问题描述

假设我有这个代码:

await Task1Async().ConfigureAwait(false);
await Task2ASync().ConfigureAwait(false);

配置等待允许在与调用线程不同的线程上运行。

但是,如果我执行以下操作:

Task.WaitAll(
    Task1Async,
    Task2Async
);

标签: c#asynchronoustask

解决方案


async Task TestAsync()
{
  await Task1Async().ConfigureAwait(false);
  await Task2ASync().ConfigureAwait(false);
}

配置等待允许在与调用线程不同的线程上运行。

澄清一下,ConfigureAwait(false)在您的代码示例中,对里面代码和. 默认情况下,将捕获其上下文并在该上下文上恢复;这适用于上面代码中的方法。有关更多信息,请参阅我的异步介绍 Task1AsyncTask2AsyncawaitawaitTestAsync

但是如果我[使用Task.WaitAll],任务是否在相同的上下文中运行?

Task.WaitAll用于等待任务。它不运行任务。TAP 模式指定任务返回“热” - 即,已经在进行中。因此,当您的代码调用Task1Async()并取回任务时,该任务已经在进行中。在你的代码得到任务之后,告诉它在哪里运行已经太晚了——它已经开始了。

如果没有,我可以做一个等效的 ConfigureAwait(false) 吗?

如果您的意思是“我可以在后台线程上运行此代码吗?”,那么您可以使用Task.Run

// Start Task1Async on a background thread.
var task1 = Task.Run(() => Task1Async());

// Start Task2Async on a background thread.
var task2 = Task.Run(() => Task2Async());

// Asynchronously wait for both tasks to complete.
await Task.WhenAll(task1, task2);

推荐阅读