Поделиться через


Параллелизм данных (библиотека параллельных задач)

Термин параллелизм данных относится к сценариям, в которых одинаковые операции для элементов исходной коллекции или массива выполняются одновременно (то есть параллельно). Параллелизм данных с декларативным синтаксисом поддерживается несколькими перегрузками метода For и метода ForEach в классе System.Threading.Tasks.Parallel. В параллельных операциях с данными исходная коллекция разделяется на части, чтобы несколько потоков могли одновременно работать с различными сегментами. Библиотека параллельных задач поддерживает параллелизм данных с помощью класса System.Threading.Tasks.Parallel. Этот класс предоставляет основанные на методе параллельные реализации циклов for и foreach (For и For Each в Visual Basic). Запись логики для цикла Parallel.For или Parallel.ForEach похожа на запись последовательного цикла. Нет необходимости создавать потоки или очередь рабочих элементов. В основных циклах нет необходимости принимать блокировки. Библиотека параллельных задач обрабатывает все низкоуровневые работы. В следующем примере кода показан простой цикл foreach и его параллельный эквивалент.

ПримечаниеПримечание

В этой документации для определения делегатов в библиотеке параллельных задач используются лямбда-выражения.Сведения о лямбда-выражениях в C# или Visual Basic см. в разделе Лямбда-выражения в PLINQ и библиотеке параллельных задач.

' Sequential version        
For Each item In sourceCollection
    Process(item)
Next

' Parallel equivalent
Parallel.ForEach(sourceCollection, Sub(item) Process(item))
// Sequential version            
foreach (var item in sourceCollection)
{
    Process(item);
}

// Parallel equivalent
Parallel.ForEach(sourceCollection, item => Process(item));

При выполнении параллельного цикла библиотека параллельных задач разделяет источник данных таким образом, чтобы цикл мог одновременно работать с несколькими частями. В фоновом режиме планировщик заданий разделяет задачу на основе системных ресурсов и рабочей нагрузки. По возможности планировщик перераспределяет работы между несколькими потоками и процессорами, если рабочая нагрузка становится несбалансированной.

ПримечаниеПримечание

Можно также указать собственный пользовательский модуль разделения или планировщик.Дополнительные сведения см. в разделах Пользовательские разделители для PLINQ и TPL и Планировщики заданий.

Методы Parallel.For и Parallel.ForEach имеют несколько перегрузок, которые позволяют остановить или прервать выполнение цикла, отследить состояние цикла в других потоках, поддержать локальное состояние потока, завершить локальные объекты потока, контролировать степень параллелизма и т. д. Вспомогательные типы, обеспечивающие эту функциональную возможность, включают ParallelLoopState, ParallelOptions, ParallelLoopResult, CancellationToken и CancellationTokenSource.

Дополнительные сведения см. в разделе Параллелизм данных (библиотека параллельных задач).

В PLINQ поддерживается распараллеливание данных с декларативным синтаксисом или с синтаксисом, похожим на синтаксис запросов. Дополнительные сведения см. в разделе Parallel LINQ (PLINQ).

Связанные разделы

Заголовок

Описание

Практическое руководство. Написание простого цикла Parallel.For

Описывает порядок написания цикла For по любому массиву или по индексируемой исходной коллекции IEnumerable<T>.

Практическое руководство. Написание простого цикла Parallel.ForEach

Описывает как написать цикл ForEach по любой исходной коллекции IEnumerable<T>.

Практическое руководство. Остановка цикла Parallel.For или выход из этого цикла

Описывает как выполнить остановку или прерывание из параллельного цикла таким образом, чтобы все потоки были информированы о действии.

Практическое руководство. Написание цикла Parallel.For, содержащего локальные переменные потока

Описывает как написать цикл For, в котором каждый поток поддерживает закрытые переменные, невидимые для всех других потоков; а также, порядок синхронизации результатов из всех потоков при завершении цикла.

Практическое руководство. Написание цикла Parallel.ForEach, содержащего локальные переменные потока

Описывает как написать цикл ForEach, в котором каждый поток поддерживает закрытые переменные, невидимые для всех других потоков; а также, порядок синхронизации результатов из всех потоков при завершении цикла.

Практическое руководство. Отмена цикла Parallel.For или Parallel.ForEach

Описывает порядок отмены параллельного цикла с помощью System.Threading.CancellationToken

Практическое руководство. Повышение скорости выполнения небольших тел циклов

Описывает один из способов увеличения скорости выполнения, когда тело цикла имеет очень маленький размер.

Библиотека параллельных задач

Содержит общие сведения о библиотеке параллельных задач.

Параллельное программирование в .NET Framework

Содержит вводную информацию по параллельному программированию на платформе .NET Framework.

См. также

Основные понятия

Параллельное программирование в .NET Framework