我有一个包含两个部分的函数。在执行第二部分之前,需要第一部分的所有成功。
例如:
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;
}
}
但它也不起作用。
那是为什么?我该怎么办?
答案 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