c# - 传递给 Task.WaitAll() 的任务会在不同的上下文中运行吗?
问题描述
假设我有这个代码:
await Task1Async().ConfigureAwait(false);
await Task2ASync().ConfigureAwait(false);
配置等待允许在与调用线程不同的线程上运行。
但是,如果我执行以下操作:
Task.WaitAll(
Task1Async,
Task2Async
);
- 任务是否在相同的上下文中运行?
- 如果没有,我可以做一个等效的ConfigureAwait(false)吗?
解决方案
async Task TestAsync()
{
await Task1Async().ConfigureAwait(false);
await Task2ASync().ConfigureAwait(false);
}
配置等待允许在与调用线程不同的线程上运行。
澄清一下,ConfigureAwait(false)
在您的代码示例中,对里面的代码和. 默认情况下,将捕获其上下文并在该上下文上恢复;这适用于上面代码中的方法。有关更多信息,请参阅我的异步介绍。 Task1Async
Task2Async
await
await
TestAsync
但是如果我[使用
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);
推荐阅读
- macos - dyld:库未加载:@rpath/libmkl_intel_lp64.dylib
- curl - Rest API cURL POST 通过 Google Script FetchUrlApp()
- css - 使按钮粘在页面底部*但*尊重滚动
- angular - Angular 6 中的多 ./styles.css 中的错误
- php - 在 Woocommerce 中获取具有特定产品属性的产品购买总数
- javascript - Meteor 应用程序上 React JS 中的访问控制允许来源
- javascript - 如何使用react js过滤html表的所有列?
- angular - 如何在按钮单击时添加新功能
- angular - 如何在 Angular 材料 6 表中使用 colspan 和 ngFor?
- elasticsearch - 使用java客户端Api时如何将_delete_by_query限制为单一类型