Проблемы .net Core Parallel.ForEach
Я переключился на .net Core для некоторых проектов и теперь у меня проблема с Parallel.ForEach. В прошлом у меня часто был список значений идентификаторов, которые я затем использовал бы для создания веб-запросов, чтобы получить полные данные. Это будет выглядеть примерно так:
Parallel.ForEach(myList, l =>
{
// make web request using l.id
// process the data somehow
});
Ну, в .net Core все веб-запросы должны быть помеченыawait
это означает, что действие Parallel.ForEach должно быть помечено какasync
, Но, помечая действие Parallel.ForEach какasync
означает, что у нас естьvoid async
метод, который вызывает проблемы. В моем конкретном случае это означает, что ответ возвращается в приложениедо все веб-запросы в цикле Parallel завершены, что одновременно неудобно и вызывает ошибки.
Вопрос: Какие есть альтернативы использованию Parallel.ForEach здесь?
Одно из возможных решений, которое я нашел, заключалось в том, чтобы обернуть параллельный цикл внутри задачи и дождаться ее:
await Task.Run(() => Parallel.ForEach(myList, l =>
{
// stuff here
}));
(найдено здесь:Parallel.ForEach vs Task.Run и Task.WhenAll)
Но это не работает для меня. Когда я использую это, я все равно возвращаюсь к приложению до завершения цикла.
Другой вариант:
var tasks = new List<Task>();
foreach (var l in myList)
{
tasks.Add(Task.Run(async () =>
{
// stuff here
}));
}
await Task.WhenAll(tasks);
Похоже, это работает, но это единственный вариант? Кажется, что новое ядро .net сделало Parallel.ForEach практически бесполезным (по крайней мере, когда речь идет о вложенных веб-вызовах).
Любая помощь / совет приветствуется.