首页 > 解决方案 > 如何等待所有任务完成

问题描述

我有一个包含两个部分的功能。在执行第二部分之前需要第一部分的所有成功。

如:

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;
    }
}


但它也没有用。

这是为什么?我应该怎么办?

标签: c#.net

解决方案


你不会有任何数据,dict因为传入asynclambda 不会对Taskctor 产生任何影响。

您将需要对代码进行相当多的重组。你想调用你的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是一个全局变量并且您需要锁定,那么您应该只替换上面ToDictionaryConcurrentDictionary代码,因为这是示例代码。


推荐阅读