Ответ 1
С отсутствием ответов я решил оценить ответы ниже с тем, что я узнал. Как заявил @Scott,.NET 4 добавила параллельную библиотеку задач, которая добавляет ряд нововведений, новые методы и подходы к parallelism.
- Одна из первых вещей - методы
Parallel.For
иParallel.ForEach
, которые позволяют разработчику обрабатывать несколько элементов в нескольких потоках. Framework в этом случае будет решать, сколько потоков необходимо, а когда создавать новые потоки, а когда нет.
Это очень простой и простой способ распараллеливать существующий код и повысить производительность. - Другим способом, несколько похожим на предыдущие подходы, является использование расширителей PLINQ. Они берут существующее перечисление и расширяют его с помощью параллельных расширений linq. Поэтому, если у вас есть существующий запрос linq, вы можете легко преобразовать его в PLINQ. Это означает, что все операции над перечислением PLINQ также будут использовать преимущества нескольких потоков, и фильтрация вашего списка объектов с помощью предложения
.Where
, например, будет выполняться в нескольких потоках сейчас! - Одним из самых больших нововведений в TPL является новый класс
Task
. В некотором смысле это может выглядеть как уже известный классThread
, но он использует новый пул потоков в .NET 4 (который был значительно улучшен по сравнению с предыдущими версиями) и намного более функциональен, чем обычныйThread
класс. Например, вы можете связать задачи, в которых задачи в середине цепочки будут запускаться только при завершении предыдущих. Примеры и подробное объяснение в screencast на Channel 9 - Чтобы улучшить работу с классами Task, мы можем использовать
BlockingCollection<>
. Это прекрасно работает в ситуациях, когда у вас есть сценарий производителя-потребителя. У вас может быть несколько потоков, производящих некоторые объекты, которые затем будут потребляться и обрабатываться с помощью потребительских методов. Это можно легко распараллелить и контролировать с помощью задачи factory и блокировки. Полезный скринкаст с примерами из Channel 9
Они также могут использовать разные классы хранения резервных копий (ConcurrentQueue, ConcurentStack, ConcurrentBag), которые все поточно-безопасны и отличаются по порядку и производительности элементов. Примеры и объяснения их в другом видео здесь - Добавлена еще одна новая вещь (которая, вероятно, не является частью TPL, но помогает нам здесь) является классом
CountdownEvent
, который может помочь нам в "сценариях координации задач" (с). В принципе, мы можем дождаться завершения всех параллельных задач. Screencast с примером использования на Channel 9
Вы можете увидеть ряд видеороликов и видеороликов на канале 9, отмеченных "Parallel Computing"