У вас может возникнуть вопрос: почему взаимодействовать с пулом потоков, поддерживаемым средой .NET Core Runtime, выгоднее по сравнению с явным созданием объектов Thread
• Пул потоков эффективно управляет потоками, сводя к минимуму количество потоков, которые должны создаваться, запускаться и останавливаться.
• За счет применения пула потоков можно сосредоточиться на решении задачи, а не на потоковой инфраструктуре приложения.
Тем не менее, в некоторых случаях ручное управление потоками оказывается более предпочтительным. Ниже приведены примеры.
• Когда требуются потоки переднего плана или должен устанавливаться приоритет потока. Потоки из пула
ThreadPriority.Normal).• Когда требуется поток с фиксированной идентичностью, чтобы его можно было прерывать, приостанавливать или находить по имени.
На этом исследование пространства имен System.Threading
Параллельное программирование с использованием TPL
Вы уже ознакомились с объектами из пространства имен System.Threading
System.Threading.Tasks можно строить мелкомодульный масштабируемый параллельный код без необходимости напрямую иметь дело с потоками или пулом потоков.Однако речь не идет о том, что вы не будете использовать типы из пространства имен System.Threading
System.Threading по-прежнему предоставляет большинство примитивов синхронизации, которые рассматривались ранее (Monitor, Interlocked и т.д.). В итоге вы на самом деле обнаружите, что иметь дело с библиотекой TPL предпочтительнее, чем с первоначальным пространством имен System.Threading, т.к. те же самые задачи могут решаться гораздо проще. Пространство имен System.Threading.Tasks
Все вместе типы из пространства System.Threading.Tasks
Роль класса Parallel
Основным классом в TPL является System.Threading.Tasks.Parallel
IEnumerable) в параллельной манере. Это делается главным образом посредством двух статических методов Parallel.For() и Parallel.ForEach(), каждый из которых имеет множество перегруженных версий.Упомянутые методы позволяют создавать тело из операторов кода, которое будет выполняться в параллельном режиме. Концептуально такие операторы представляют логику того же рода, которая была бы написана в нормальной циклической конструкции (с использованием ключевых слов for
foreach языка С#). Преимущество заключается в том, что класс Parallel будет самостоятельно извлекать потоки из пула потоков (и управлять параллелизмом).Оба метода требуют передачи совместимого с IEnumerable
IEnumerable контейнера, который хранит данные, подлежащие обработке в параллельном режиме. Контейнер может быть простым массивом, необобщенной коллекцией (вроде ArrayList), обобщенной коллекцией (наподобие List) или результатами запроса LINQ.