Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Параллелизм данных относится к сценариям, в которых одна и та же операция выполняется параллельно (то есть параллельно) для элементов в исходной коллекции или массиве. В параллельных операциях с данными исходная коллекция секционируется таким образом, чтобы несколько потоков могли работать одновременно на разных сегментах.
Библиотека параллельных задач (TPL) поддерживает параллелизм данных через System.Threading.Tasks.Parallel класс. Этот класс предоставляет параллельные реализации циклов for и foreach на основе методов (For
и For Each
в Visual Basic). Вы пишете логику для цикла Parallel.For или Parallel.ForEach так же, как при написании последовательного цикла. Вам не нужно создавать потоки или элементы очереди работы. В базовых циклах не требуется устанавливать блокировки. TPL обрабатывает все низкоуровневые задачи для вас. Подробные сведения об использовании Parallel.For и Parallel.ForEach можно найти в документе Шаблоны параллельного программирования: изучение и применение параллельных шаблонов в .NET Framework 4. В следующем примере кода показан простой foreach
цикл и его параллельный эквивалент.
Замечание
В этой документации используются лямбда-выражения для определения делегатов в TPL. Если вы не знакомы с лямбда-выражениями в C# или Visual Basic, см. лямбда-выражения в PLINQ и TPL.
// Sequential version
foreach (var item in sourceCollection)
{
Process(item);
}
// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));
' Sequential version
For Each item In sourceCollection
Process(item)
Next
' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
При выполнении параллельного цикла TPL разделяет источник данных, чтобы цикл мог одновременно работать с несколькими частями. Планировщик задач секционирует задачу на основе системных ресурсов и рабочей нагрузки. По возможности планировщик распределяет работу между несколькими потоками и процессорами, если рабочая нагрузка становится небалансированной.
Замечание
Вы также можете указать собственный пользовательский секционировщик или планировщик. Дополнительные сведения см. в разделах "Пользовательские секционеры для PLINQ и TPL" и "Планировщики задач".
Parallel.For Parallel.ForEach Оба метода имеют несколько перегрузок, которые позволяют останавливать или прерывать выполнение цикла, отслеживать состояние цикла на других потоках, поддерживать локальное состояние потока, завершать локальные объекты потока, управлять степенью параллелизма и т. д. Вспомогательные типы, обеспечивающие эту функциональность, включают ParallelLoopState, ParallelOptions, ParallelLoopResultи CancellationTokenCancellationTokenSource.
Дополнительные сведения см. в разделе "Шаблоны параллельного программирования: понимание и применение параллельных шаблонов с помощью .NET Framework 4".
Параллелизм данных с декларативным или запросным синтаксисом поддерживается PLINQ. Дополнительные сведения см. в статье Parallel LINQ (PLINQ).
Связанные разделы
Название | Описание |
---|---|
Практическое руководство. Написание простого цикла Parallel.For | Описывает запись цикла по любому массиву For или индексируемой IEnumerable<T> коллекции источников. |
Практическое руководство. Написание простого цикла Parallel.ForEach | Описывает, как написать цикл для любой исходной коллекции ForEachIEnumerable<T>. |
Как: Остановить или выйти из цикла Parallel.For | Описывает, как остановить или разорвать параллельный цикл, чтобы все потоки были проинформированы о действии. |
Как: Написать цикл Parallel.For с Thread-Local переменными | Описывает, как писать For цикл, в котором каждый поток поддерживает частную переменную, которая не отображается для других потоков, и как синхронизировать результаты из всех потоков после завершения цикла. |
Как: Написать цикл Parallel.ForEach с переменными Partition-Local | Описывает, как писать ForEach цикл, в котором каждый поток поддерживает частную переменную, которая не отображается для других потоков, и как синхронизировать результаты из всех потоков после завершения цикла. |
Практическое руководство. Отмена цикла Parallel.For или ForEach | Описывается, как отменить параллельный цикл с помощью System.Threading.CancellationToken |
Как ускорить выполнение небольших циклов | Описывает один из методов ускорения исполнения, когда тело цикла очень мало. |
Библиотека параллельных задач (TPL) | Общие сведения о библиотеке параллельных задач. |
Параллельное программирование | В этой статье описывается параллельное программирование в .NET Framework. |