AsParallel.ForAll против Parallel.ForEach
Есть ли разница между приведенными ниже фрагментами кода. Если да, то что?
myList.AsParallel().ForAll(i => { /*DO SOMETHING*/ });
и
Parallel.ForEach(mylist, i => { /*DO SOMETHING*/ });
Будет ли основной поток ждать завершения всех дочерних потоков? В приложении MVC, если я выполняю параллельную обработку в своем действии контроллера, что происходит с дочерними потоками после завершения основного потока. Будут ли они отменены или они будут завершены даже после завершения основного потока?
Ответы
Ответ 1
Parallel.ForEach()
предназначен именно для этого типа кода.
С другой стороны, ForAll()
предназначен для использования в конце (возможно сложного) запроса PLINQ.
Из-за этого, я думаю, Parallel.ForEach()
- лучший выбор здесь.
В обоих случаях текущий поток будет использоваться для выполнения вычислений (наряду с некоторыми потоками из пула потоков), и метод вернется только после завершения всей обработки.
Ответ 2
У вас есть возможность заказать элементы с помощью AsParallel(). AsOrdered(). Заказ в Parallel.ForEach не из коробки, нам нужно это сделать.