Давайте рассмотрим более простой пример, иллюстрирующий те же проблемы
У вас есть код, похожий на этот
var results = new Dictionary<int, int>();
Parallel.ForEach(Enumerable.Range(0, 5), async index =>
{
var result = await DoAsyncJob(index);
results.TryAdd(index, result);
});
Ваш код не работает, потому что выражение
async index => {...}
возвращает задание, которое не ожидается
как это
Parallel.ForEach(Enumerable.Range(0, 5), index => new Task());
Кстати, когда вы работаете с многопоточностью, как в вашем примере, вы должны использовать ConcurrentDictionary вместо словаря, когда вы делаете параллельные обновления, чтобы избежать ошибок и тупиков
Лучшее решение здесь - не использовать параллельный цикл, а вместо этого использовать Task.WhenAll
var tasks = Enumerable.Range(0, 5).Select(async index =>
{
var result = await DoAsyncJob(index);
results.TryAdd(index, result);
});
await Task.WhenAll(tasks);