c# - 如何等待所有任务完成
问题描述
我有一个包含两个部分的功能。在执行第二部分之前需要第一部分的所有成功。
如:
ConcurrentDictionary<string, string> _dic = new ConcurrentDictionary<string, string>();
var _taskList = new List<Task>();
foreach (var item in someDataList)
{
_taskList.Add(new Task(async () =>
{
var result = await _req.ExecuteAsync(someParams).ConfigureAwait(false);
_dic.TryAdd(result.data, result.data);
}
}
_taskList.ForEach(t => t.Start());
await Task.WhenAll(_taskList.ToArray()).ConfigureAwait(false);
if (_dic.Count == List.count()
{
//execute part 2.
}
不等待所有任务完成,任何时候字典里都没有数据。我尝试:
while (true)
{
foreach (var item in _taskList)
{
if (item.Status == TaskStatus.Running)
goto continueWait;
}
}
但它也没有用。
这是为什么?我应该怎么办?
解决方案
你不会有任何数据,dict
因为传入async
lambda 不会对Task
ctor 产生任何影响。
您将需要对代码进行相当多的重组。你想调用你的async
方法,把它Task
放在你的列表中,然后await
直到它们完成。完成后,您可以遍历任务列表中的所有结果并.Result
从中提取。
var tasks = someDataList.Select(i => _req.ExecuteAsync(i) );
await Task.WhenAll(tasks);
var dict = tasks.ToDictionary(t=> t.Result);
if (dict.Count == List.count()
{
//execute part 2.
}
请注意,如果_dict
是一个全局变量并且您需要锁定,那么您应该只替换上面ToDictionary
的ConcurrentDictionary
代码,因为这是示例代码。
推荐阅读
- javascript - 即使函数为真,表单也不提交
- asp.net - 在 .net 框架中本地开发时如何使用 Key Vault?
- chef-infra - 如何在厨师角色文件中添加特定版本
- python-3.x - 通过扩展右数据框的单元格内容省略左连接中的重复项
- javascript - putImageData 无法缩放/适合画布中的视频/图像(HTML5、CSS、JS)
- javascript - 如何覆盖代理在控制台中的显示方式?
- wordpress - 将excel文件导入wordpress数据库
- excel - 如何摆脱运行时错误 91 对象变量或未设置块变量?
- apache-spark - Databricks 中使用的集群管理器是什么?如何更改 Databricks 集群中的执行程序数量?
- jenkins - 获取 Jenkins docker slaves 的映射端口作为管道参数