Ответ 1
Основное различие является функциональным. Parallel.ForEach
будет блокировать (по дизайну), поэтому он не вернется, пока все объекты не будут обработаны. Ваша работа с потоком нити thread foreach
будет толкать работу на потоки фона, а не блокировать.
Кроме того, версия Parallel.ForEach
будет иметь еще одно важное преимущество - необработанные исключения будут отброшены на сайт вызова здесь, а не оставлены необработанными в потоке ThreadPool.
В общем случае Parallel.ForEach
будет более эффективным. Оба варианта используют ThreadPool, но Parallel.ForEach
выполняет интеллектуальное разбиение на разделы, чтобы предотвратить чрезмерное воспроизведение и уменьшить количество накладных расходов, требуемых планировщиком. Индивидуальные задачи (которые будут отображаться в потоках ThreadPool) будут повторно использоваться и эффективно "объединены", чтобы снизить накладные расходы, особенно если SendFilesToClient
- это быстрая операция (которая в этом случае не будет правдой).
Обратите внимание, что вы также можете в качестве третьего варианта использовать PLINQ:
objClientList.AsParallel().ForAll(SendFilesToClient);
Это будет очень похоже на метод Parallel.ForEach
с точки зрения производительности и функциональности.