недавно я видел несколько SO-потоков, связанных с Parallel.ForEach, смешанных с асин * лямбдами c, но все предложенные ответы были своего рода обходными путями.
Ну, это потому что Parallel
не работает с async
. И с другой точки зрения, почему вы хотите смешать их в первую очередь? Они делают противоположные вещи . Parallel
- это добавление потоков, а async
- отказ от потоков. Если вы хотите выполнять асинхронную работу одновременно, используйте Task.WhenAll
. Это правильный инструмент для работы; Parallel
это не так.
Тем не менее, звучит так, как будто вы хотите использовать не тот инструмент, вот как вы это делаете ...
Как я могу обеспечить этот список будет содержать все элементы из всех итераций, выполненных с лямбдами в каждой итерации?
Вам понадобится какой-то сигнал, который может блокировать некоторый код до завершения обработки, например, CountdownEvent
или Monitor
. Кроме того, вам необходимо защитить доступ к не-поточно-безопасному List<T>
.
Как обычно Parallel.ForEach будет работать с асинхронными c лямбдами, если это Удар в ожидании, передаст ли он свой поток на следующую итерацию?
Поскольку Parallel
не понимает async
лямбда-выражений, когда первый await
возвращает (возвращается) своему вызывающему, Parallel
будет предполагать, что целое число l oop завершено.
Я предполагаю, что поле ParallelLoopResult IsCompleted не является правильным, так как оно вернет true, когда все итерации выполнены, независимо от того, является ли их действительная лямбда задания завершены или нет?
Правильно. Насколько известно Parallel
, он может «видеть» только метод первого await
, который возвращает его вызывающему. Так что он не знает, когда лямбда будет завершена. Он также будет предполагать, что итерации завершены слишком рано, что приводит к удалению разделов.