如何等待所有任务完成

时间:2019-12-09 01:51:47

标签: c# .net

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

例如:

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


但它也不起作用。

那是为什么?我该怎么办?

2 个答案:

答案 0 :(得分:4)

您的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代码,因为这是示例代码。

答案 1 :(得分:0)

下面的异步循环示例代码

IFormatProvider