Parallel.ForEach Метод

Определение

Выполняет операцию foreach (For Each в Visual Basic), обеспечивая возможность параллельного выполнения итераций.

Перегрузки

ForEach<TSource,TLocal>(IEnumerable<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource,TLocal>(IEnumerable<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Выполняет операцию foreach (For Each в Visual Basic) с 64-разрядными индексами и локальными данными потока для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource,TLocal>(Partitioner<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource,TLocal>(OrderablePartitioner<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

foreach Выполняет операцию (For Each в Visual Basic) с 64-разрядными индексами и локальными данными OrderablePartitioner<TSource> потока в , в которой итерации могут выполняться параллельно, можно настроить параметры цикла, а также отслеживать состояние цикла и управлять ими.

ForEach<TSource,TLocal>(IEnumerable<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource,TLocal>(IEnumerable<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource,TLocal>(Partitioner<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource,TLocal>(OrderablePartitioner<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта OrderablePartitioner<TSource>, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource>)

Выполняет операцию foreach (For Each в Visual Basic) для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций и настройки параметров цикла.

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource,ParallelLoopState>)

Выполняет операцию foreach (For Each в Visual Basic) для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource>(OrderablePartitioner<TSource>, ParallelOptions, Action<TSource,ParallelLoopState,Int64>)

Выполняет операцию foreach (For Each в Visual Basic) для объекта OrderablePartitioner<TSource>, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource>(Partitioner<TSource>, ParallelOptions, Action<TSource>)

Выполняет операцию foreach (For Each в Visual Basic) для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций и настройки параметров цикла.

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource,ParallelLoopState,Int64>)

Выполняет операцию foreach (For Each в Visual Basic) с 64-разрядными индексами для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource>(Partitioner<TSource>, Action<TSource,ParallelLoopState>)

Выполняет операцию foreach (For Each в Visual Basic) для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource>(Partitioner<TSource>, Action<TSource>)

Выполняет операцию foreach (For Each в Visual Basic) для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций.

ForEach<TSource>(IEnumerable<TSource>, Action<TSource,ParallelLoopState,Int64>)

Выполняет операцию foreach (For Each в Visual Basic) с 64-разрядными индексами для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource>(OrderablePartitioner<TSource>, Action<TSource,ParallelLoopState,Int64>)

Выполняет операцию foreach (For Each в Visual Basic) для объекта OrderablePartitioner<TSource>, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource>(IEnumerable<TSource>, Action<TSource>)

Выполняет операцию foreach (For Each в Visual Basic) для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций.

ForEach<TSource>(Partitioner<TSource>, ParallelOptions, Action<TSource,ParallelLoopState>)

Выполняет операцию foreach (For Each в Visual Basic) для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource>(IEnumerable<TSource>, Action<TSource,ParallelLoopState>)

Выполняет операцию foreach (For Each в Visual Basic) для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

ForEach<TSource,TLocal>(IEnumerable<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal> (System.Collections.Generic.IEnumerable<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,TLocal,TLocal> body, Action<TLocal> localFinally);

Параметры типа

TSource

Тип данных в источнике.

TLocal

Тип данных, локальных для потока.

Параметры

source
IEnumerable<TSource>

Перечислимый источник данных.

parallelOptions
ParallelOptions

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

localInit
Func<TLocal>

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

body
Func<TSource,ParallelLoopState,TLocal,TLocal>

Делегат, который вызывается один раз за итерацию.

localFinally
Action<TLocal>

Делегат, который выполняет финальное действие с локальным состоянием каждой задачи.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент parallelOptions имеет значение null.

-или-

Аргумент body имеет значение null.

-или-

Аргумент localInit имеет значение null.

-или-

Аргумент localFinally имеет значение null.

Токен CancellationToken в аргументе parallelOptions отменен.

CancellationTokenSource, связанный с CancellationToken в parallelOptions, удален.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Комментарии

Делегат body вызывается один раз для каждого элемента в source перечисляемом объекте . Он предоставляется со следующими параметрами: текущий элемент, экземпляр, ParallelLoopState который может использоваться для преждевременного выхода из цикла, и некоторое локальное состояние, которое может быть совместно использовано итерациями, которые выполняются в одном потоке.

Делегат localInit вызывается один раз для каждой задачи, которая участвует в выполнении цикла, и возвращает начальное локальное состояние для каждой из этих задач. Эти начальные состояния передаются в первые body вызовы для каждой задачи. Затем каждый последующий вызов текста возвращает возможно измененное значение состояния, которое передается следующему вызову текста. Наконец, последний вызов текста для каждой задачи возвращает значение состояния, которое передается делегату localFinally . Делегат localFinally вызывается один раз для каждого потока для выполнения окончательного действия с локальным состоянием каждой задачи. Этот делегат может вызываться одновременно для нескольких задач; Поэтому необходимо синхронизировать доступ ко всем общим переменным.

Метод Parallel.ForEach может использовать больше задач, чем потоки в течение всего времени его выполнения, так как существующие задачи выполняются и заменяются новыми задачами. Это дает базовому TaskScheduler объекту возможность добавлять, изменять или удалять потоки, обслуживающие цикл.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource,TLocal>(IEnumerable<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) с 64-разрядными индексами и локальными данными потока для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal> (System.Collections.Generic.IEnumerable<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,long,TLocal,TLocal> body, Action<TLocal> localFinally);

Параметры типа

TSource

Тип данных в источнике.

TLocal

Тип данных, локальных для потока.

Параметры

source
IEnumerable<TSource>

Перечислимый источник данных.

parallelOptions
ParallelOptions

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

localInit
Func<TLocal>

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

body
Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>

Делегат, который вызывается один раз за итерацию.

localFinally
Action<TLocal>

Делегат, который выполняет финальное действие с локальным состоянием каждой задачи.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент parallelOptions имеет значение null.

-или-

Аргумент body имеет значение null.

-или-

Аргумент localInit имеет значение null.

-или-

Аргумент localFinally имеет значение null.

Токен CancellationToken в аргументе parallelOptions отменен.

CancellationTokenSource, связанный с CancellationToken в parallelOptions, удален.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Комментарии

Делегат body вызывается один раз для каждого элемента в source перечисляемом объекте . Он предоставляется со следующими параметрами: текущий элемент, экземпляр, ParallelLoopState который может использоваться для преждевременного выхода из цикла, индекс текущего элемента (Int64) и некоторое локальное состояние, которое может быть совместно использовано в итерациях, выполняемых в одном потоке.

Делегат localInit вызывается один раз для каждой задачи, которая участвует в выполнении цикла, и возвращает начальное локальное состояние для каждой из этих задач. Эти начальные состояния передаются в первые body вызовы для каждой задачи. Затем каждый последующий вызов текста возвращает возможно измененное значение состояния, которое передается следующему вызову текста. Наконец, последний вызов текста для каждой задачи возвращает значение состояния, которое передается делегату localFinally . Делегат localFinally вызывается один раз для каждого потока для выполнения окончательного действия в локальном состоянии каждой задачи. Этот делегат может вызываться одновременно для нескольких задач; Поэтому необходимо синхронизировать доступ ко всем общим переменным.

Метод Parallel.ForEach может использовать больше задач, чем потоки в течение всего времени его выполнения, так как существующие задачи завершаются и заменяются новыми задачами. Это дает базовому TaskScheduler объекту возможность добавлять, изменять или удалять потоки, обслуживающие цикл.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource,TLocal>(Partitioner<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal> (System.Collections.Concurrent.Partitioner<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,TLocal,TLocal> body, Action<TLocal> localFinally);

Параметры типа

TSource

Тип элементов в объекте source.

TLocal

Тип данных, локальных для потока.

Параметры

source
Partitioner<TSource>

Разделитель, содержащий исходный источник данных.

parallelOptions
ParallelOptions

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

localInit
Func<TLocal>

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

body
Func<TSource,ParallelLoopState,TLocal,TLocal>

Делегат, который вызывается один раз за итерацию.

localFinally
Action<TLocal>

Делегат, который выполняет финальное действие с локальным состоянием каждой задачи.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент parallelOptions имеет значение null.

-или-

Аргумент body имеет значение null.

-или-

Аргумент localInit имеет значение null.

-или-

Аргумент localFinally имеет значение null.

Свойство SupportsDynamicPartitions в разделителе sourcePartitioner возвращает значение false или разделитель возвращает части со значением null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Токен CancellationToken в аргументе parallelOptions отменен.

CancellationTokenSource, связанный с CancellationToken в parallelOptions, удален.

Комментарии

Эта перегрузка предоставляется для сценариев, в которых требуется переопределить схему секционирования по умолчанию. Например, секционирование диапазона может оказаться полезным для небольших тел цикла. Метод ForEach ожидает, что пользовательские секционеры будут поддерживать динамическое секционирование. Эта перегрузка предоставляется для сценариев с небольшими телами цикла, которые могут извлечь выгоду из секционирования статических диапазонов. Секционеры должны поддерживать динамические секции. Дополнительные сведения см. в разделах Пользовательские секционаторы для PLINQ и TPL и Практическое руководство. Реализация динамических секций.

Делегат localInit вызывается один раз для каждой задачи, которая участвует в выполнении цикла, и возвращает начальное локальное состояние для каждой из этих задач. Эти начальные состояния передаются в первые body вызовы для каждой задачи. Затем каждый последующий вызов текста возвращает возможно измененное значение состояния, которое передается следующему вызову текста. Наконец, последний вызов текста каждой задачи возвращает значение состояния, передаваемое делегату localFinally . Делегат localFinally вызывается один раз для каждой задачи для выполнения окончательного действия в локальном состоянии каждой задачи. Этот делегат может вызываться одновременно для нескольких задач; Поэтому необходимо синхронизировать доступ ко всем общим переменным.

Метод Parallel.ForEach может использовать больше задач, чем потоки в течение всего времени его выполнения, так как существующие задачи завершаются и заменяются новыми задачами. Это дает базовому TaskScheduler объекту возможность добавлять, изменять или удалять потоки, обслуживающие цикл.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource,TLocal>(OrderablePartitioner<TSource>, ParallelOptions, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

foreach Выполняет операцию (For Each в Visual Basic) с 64-разрядными индексами и локальными данными OrderablePartitioner<TSource> потока в , в которой итерации могут выполняться параллельно, можно настроить параметры цикла, а также отслеживать состояние цикла и управлять ими.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal> (System.Collections.Concurrent.OrderablePartitioner<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,long,TLocal,TLocal> body, Action<TLocal> localFinally);

Параметры типа

TSource

Тип элементов в объекте source.

TLocal

Тип данных, локальных для потока.

Параметры

source
OrderablePartitioner<TSource>

Упорядочиваемый разделитель, содержащий исходный источник данных.

parallelOptions
ParallelOptions

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

localInit
Func<TLocal>

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

body
Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>

Делегат, который вызывается один раз за итерацию.

localFinally
Action<TLocal>

Делегат, который выполняет финальное действие с локальным состоянием каждой задачи.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент parallelOptions имеет значение null.

-или-

Аргумент body имеет значение null.

-или-

Аргумент localInit или аргумент localFinally имеет значение null.

Свойство SupportsDynamicPartitions в разделителе sourcePartitioner возвращает значение false или разделитель возвращает части со значением null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Токен CancellationToken в аргументе parallelOptions отменен.

CancellationTokenSource, связанный с CancellationToken в parallelOptions, удален.

Комментарии

Эта перегрузка предоставляется для сценариев, в которых требуется переопределить схему секционирования по умолчанию. Например, секционирование диапазона может оказаться полезным для небольших тел цикла. Метод ForEach ожидает, что пользовательские секционеры будут поддерживать динамическое секционирование. Дополнительные сведения см. в разделах Пользовательские секционаторы для PLINQ и TPL и Практическое руководство. Реализация динамических секций.

Делегат localInit вызывается один раз для каждой задачи, которая участвует в выполнении цикла, и возвращает начальное локальное состояние для каждой из этих задач. Эти начальные состояния передаются в первые body вызовы для каждой задачи. Затем каждый последующий вызов текста возвращает возможно измененное значение состояния, которое передается следующему вызову текста. Наконец, последний вызов текста в каждом потоке возвращает значение состояния, передаваемое делегату localFinally . Делегат localFinally вызывается один раз для каждой задачи для выполнения окончательного действия в локальном состоянии каждой задачи. Этот делегат может вызываться одновременно для нескольких задач; Поэтому необходимо синхронизировать доступ ко всем общим переменным.

Метод Parallel.ForEach может использовать больше задач, чем потоки в течение всего времени его выполнения, так как существующие задачи завершаются и заменяются новыми задачами. Это дает базовому TaskScheduler объекту возможность добавлять, изменять или удалять потоки, обслуживающие цикл.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource,TLocal>(IEnumerable<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal> (System.Collections.Generic.IEnumerable<TSource> source, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,TLocal,TLocal> body, Action<TLocal> localFinally);

Параметры типа

TSource

Тип данных в источнике.

TLocal

Тип данных, локальных для потока.

Параметры

source
IEnumerable<TSource>

Перечислимый источник данных.

localInit
Func<TLocal>

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

body
Func<TSource,ParallelLoopState,TLocal,TLocal>

Делегат, который вызывается один раз за итерацию.

localFinally
Action<TLocal>

Делегат, который выполняет финальное действие с локальным состоянием каждой задачи.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент body имеет значение null.

-или-

Аргумент localInit имеет значение null.

-или-

Аргумент localFinally имеет значение null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Примеры

В следующем примере показано, как использовать метод с локальным ForEach состоянием:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

class ForEachWithThreadLocal
{
    // Demonstrated features:
    // 		Parallel.ForEach()
    //		Thread-local state
    // Expected results:
    //      This example sums up the elements of an int[] in parallel.
    //      Each thread maintains a local sum. When a thread is initialized, that local sum is set to 0.
    //      On every iteration the current element is added to the local sum.
    //      When a thread is done, it safely adds its local sum to the global sum.
    //      After the loop is complete, the global sum is printed out.
    // Documentation:
    //		http://msdn.microsoft.com/library/dd990270(VS.100).aspx
    static void Main()
    {
        // The sum of these elements is 40.
        int[] input = { 4, 1, 6, 2, 9, 5, 10, 3 };
        int sum = 0;

        try
        {
            Parallel.ForEach(
                    input,					        // source collection
                    () => 0,					        // thread local initializer
                    (n, loopState, localSum) =>		// body
                    {
                        localSum += n;
                        Console.WriteLine("Thread={0}, n={1}, localSum={2}", Thread.CurrentThread.ManagedThreadId, n, localSum);
                        return localSum;
                    },
                    (localSum) => Interlocked.Add(ref sum, localSum)					// thread local aggregator
                );

            Console.WriteLine("\nSum={0}", sum);
        }
        // No exception is expected in this example, but if one is still thrown from a task,
        // it will be wrapped in AggregateException and propagated to the main thread.
        catch (AggregateException e)
        {
            Console.WriteLine("Parallel.ForEach has thrown an exception. THIS WAS NOT EXPECTED.\n{0}", e);
        }
    }
}

Комментарии

Делегат body вызывается один раз для каждого элемента перечисления source . Он предоставляется со следующими параметрами: текущий элемент, экземпляр, ParallelLoopState который может использоваться для преждевременного выхода из цикла, и некоторое локальное состояние, которое может быть совместно использовано между итерациями, выполняемыми в одном потоке.

Делегат localInit вызывается один раз для каждой задачи, которая участвует в выполнении цикла, и возвращает начальное локальное состояние для каждой из этих задач. Эти начальные состояния передаются в первые body вызовы для каждой задачи. Затем каждый последующий вызов текста возвращает возможно измененное значение состояния, которое передается следующему вызову текста. Наконец, последний вызов текста каждой задачи возвращает значение состояния, передаваемое делегату localFinally . Делегат localFinally вызывается один раз для каждого потока для выполнения окончательного действия в локальном состоянии каждой задачи. Этот делегат может вызываться одновременно для нескольких задач; Поэтому необходимо синхронизировать доступ ко всем общим переменным.

Метод Parallel.ForEach может использовать больше задач, чем потоки в течение всего времени его выполнения, так как существующие задачи выполняются и заменяются новыми задачами. Это дает базовому TaskScheduler объекту возможность добавлять, изменять или удалять потоки, обслуживающие цикл.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource,TLocal>(IEnumerable<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal> (System.Collections.Generic.IEnumerable<TSource> source, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,long,TLocal,TLocal> body, Action<TLocal> localFinally);

Параметры типа

TSource

Тип данных в источнике.

TLocal

Тип данных, локальных для потока.

Параметры

source
IEnumerable<TSource>

Перечислимый источник данных.

localInit
Func<TLocal>

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

body
Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>

Делегат, который вызывается один раз за итерацию.

localFinally
Action<TLocal>

Делегат, который выполняет финальное действие с локальным состоянием каждой задачи.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент body имеет значение null.

-или-

Аргумент localInit имеет значение null.

-или-

Аргумент localFinally имеет значение null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Комментарии

Делегат body вызывается один раз для каждого элемента в source перечисляемом объекте . Он предоставляется со следующими параметрами: текущий элемент, экземпляр, ParallelLoopState который может использоваться для преждевременного выхода из цикла, индекс текущего элемента (Int64) и некоторое локальное состояние, которое может быть совместно использовано в итерациях, выполняемых в одном потоке.

Делегат localInit вызывается один раз для каждой задачи, которая участвует в выполнении цикла, и возвращает начальное локальное состояние для каждой из этих задач. Эти начальные состояния передаются в первые body вызовы для каждой задачи. Затем каждый последующий вызов текста возвращает возможно измененное значение состояния, которое передается следующему вызову текста. Наконец, последний вызов текста для каждой задачи возвращает значение состояния, которое передается делегату localFinally . Делегат localFinally вызывается один раз для каждой задачи для выполнения окончательного действия в локальном состоянии каждой задачи. Этот делегат может вызываться одновременно для нескольких задач; Поэтому необходимо синхронизировать доступ ко всем общим переменным.

Метод Parallel.ForEach может использовать больше задач, чем потоки в течение всего времени его выполнения, так как существующие задачи выполняются и заменяются новыми задачами. Это дает базовому TaskScheduler объекту возможность добавлять, изменять или удалять потоки, обслуживающие цикл.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource,TLocal>(Partitioner<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,TLocal,TLocal>, Action<TLocal>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal> (System.Collections.Concurrent.Partitioner<TSource> source, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,TLocal,TLocal> body, Action<TLocal> localFinally);

Параметры типа

TSource

Тип элементов в объекте source.

TLocal

Тип данных, локальных для потока.

Параметры

source
Partitioner<TSource>

Разделитель, содержащий исходный источник данных.

localInit
Func<TLocal>

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

body
Func<TSource,ParallelLoopState,TLocal,TLocal>

Делегат, который вызывается один раз за итерацию.

localFinally
Action<TLocal>

Делегат, который выполняет финальное действие с локальным состоянием каждой задачи.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент body имеет значение null.

-или-

Аргумент localInit имеет значение null.

-или-

Аргумент localFinally имеет значение null.

Свойство SupportsDynamicPartitions в разделителе sourcePartitioner возвращает значение false или разделитель возвращает части со значением null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Комментарии

Эта перегрузка предоставляется для сценариев, в которых требуется переопределить схему секционирования по умолчанию. Например, небольшие тела цикла могут воспользоваться преимуществами секционирования диапазона. Метод ForEach ожидает, что пользовательские секционеры будут поддерживать динамическое секционирование. Дополнительные сведения см. в разделах Пользовательские секционаторы для PLINQ и TPL и Практическое руководство. Реализация динамических секций.

Делегат localInit вызывается один раз для каждого потока, участвующего в выполнении цикла, и возвращает начальное локальное состояние для каждой из этих задач. Эти начальные состояния передаются в первые body вызовы для каждой задачи. Затем каждый последующий вызов текста возвращает возможно измененное значение состояния, которое передается следующему вызову текста. Наконец, последний вызов текста для каждой задачи возвращает значение состояния, которое передается делегату localFinally . Делегат localFinally вызывается один раз для каждой задачи для выполнения окончательного действия в локальном состоянии каждой задачи. Этот делегат может вызываться одновременно для нескольких задач; Поэтому необходимо синхронизировать доступ ко всем общим переменным.

Метод Parallel.ForEach может использовать больше задач, чем потоки в течение всего времени его выполнения, так как существующие задачи выполняются и заменяются новыми задачами. Это дает базовому TaskScheduler объекту возможность добавлять, изменять или удалять потоки, обслуживающие цикл.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource,TLocal>(OrderablePartitioner<TSource>, Func<TLocal>, Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>, Action<TLocal>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) с локальными данными потока для объекта OrderablePartitioner<TSource>, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource,TLocal> (System.Collections.Concurrent.OrderablePartitioner<TSource> source, Func<TLocal> localInit, Func<TSource,System.Threading.Tasks.ParallelLoopState,long,TLocal,TLocal> body, Action<TLocal> localFinally);

Параметры типа

TSource

Тип элементов в объекте source.

TLocal

Тип данных, локальных для потока.

Параметры

source
OrderablePartitioner<TSource>

Упорядочиваемый разделитель, содержащий исходный источник данных.

localInit
Func<TLocal>

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

body
Func<TSource,ParallelLoopState,Int64,TLocal,TLocal>

Делегат, который вызывается один раз за итерацию.

localFinally
Action<TLocal>

Делегат, который выполняет финальное действие с локальным состоянием каждой задачи.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент body имеет значение null.

-или-

Аргумент localInit имеет значение null.

-или-

Аргумент localFinally имеет значение null.

Свойство SupportsDynamicPartitions в разделителе sourcePartitioner возвращает значение false или разделитель возвращает части со значением null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Комментарии

Эта перегрузка предоставляется для сценариев, в которых требуется переопределить схему секционирования по умолчанию. Например, небольшие тела цикла могут воспользоваться преимуществами секционирования диапазона. Метод ForEach ожидает, что пользовательские секционеры будут поддерживать динамическое секционирование. Дополнительные сведения см. в разделах Пользовательские секционаторы для PLINQ и TPL и Практическое руководство. Реализация динамических секций.

Делегат localInit вызывается один раз для каждой задачи, которая участвует в выполнении цикла, и возвращает начальное локальное состояние для каждой из этих задач. Эти начальные состояния передаются в первые body вызовы для каждой задачи. Затем каждый последующий вызов текста возвращает возможно измененное значение состояния, которое передается следующему вызову текста. Наконец, последний вызов текста для каждой задачи возвращает значение состояния, которое передается делегату localFinally . Делегат localFinally вызывается один раз для каждой задачи для выполнения окончательного действия в локальном состоянии каждой задачи. Этот делегат может вызываться одновременно для нескольких задач; Поэтому необходимо синхронизировать доступ ко всем общим переменным.

Метод Parallel.ForEach может использовать больше задач, чем потоки в течение всего времени его выполнения, так как существующие задачи выполняются и заменяются новыми задачами. Это дает базовому TaskScheduler объекту возможность добавлять, изменять или удалять потоки, обслуживающие цикл.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций и настройки параметров цикла.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Generic.IEnumerable<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource> body);

Параметры типа

TSource

Тип данных в источнике.

Параметры

source
IEnumerable<TSource>

Перечислимый источник данных.

parallelOptions
ParallelOptions

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

body
Action<TSource>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Токен CancellationToken в аргументе parallelOptions отменен

Аргумент source имеет значение null.

-или-

Аргумент parallelOptions имеет значение null.

-или-

Аргумент body имеет значение null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

CancellationTokenSource, связанный с CancellationToken в parallelOptions, удален.

Комментарии

Делегат body вызывается один раз для каждого элемента в source перечисляемом объекте . Он предоставляется с текущим элементом в качестве параметра.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource,ParallelLoopState>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Generic.IEnumerable<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource,System.Threading.Tasks.ParallelLoopState> body);

Параметры типа

TSource

Тип данных в источнике.

Параметры

source
IEnumerable<TSource>

Перечислимый источник данных.

parallelOptions
ParallelOptions

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

body
Action<TSource,ParallelLoopState>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Токен CancellationToken в аргументе parallelOptions отменен

Аргумент source имеет значение null.

-или-

Аргумент parallelOptions имеет значение null.

-или-

Аргумент body имеет значение null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

CancellationTokenSource, связанный с CancellationToken в parallelOptions, удален.

Комментарии

Делегат body вызывается один раз для каждого элемента в source перечисляемом объекте . Он предоставляется со следующими параметрами: текущим элементом и экземпляром ParallelLoopState , который может использоваться для преждевременного выхода из цикла.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(OrderablePartitioner<TSource>, ParallelOptions, Action<TSource,ParallelLoopState,Int64>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) для объекта OrderablePartitioner<TSource>, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Concurrent.OrderablePartitioner<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource,System.Threading.Tasks.ParallelLoopState,long> body);

Параметры типа

TSource

Тип элементов в объекте source.

Параметры

source
OrderablePartitioner<TSource>

Упорядочиваемый разделитель, содержащий исходный источник данных.

parallelOptions
ParallelOptions

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

body
Action<TSource,ParallelLoopState,Int64>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Токен CancellationToken в аргументе parallelOptions отменен

Аргумент source имеет значение null.

-или-

Аргумент parallelOptions имеет значение null.

-или-

Аргумент body имеет значение null.

CancellationTokenSource, связанный с CancellationToken в parallelOptions, удален.

Свойство SupportsDynamicPartitions в упорядочиваемом разделителе source возвращает значение false.

-или-

Свойство KeysNormalized в упорядочиваемом разделителе source возвращает значение false.

-или-

Исключение, которое возникает, когда методы в упорядочиваемом разделителе source возвращают значение null.

Исключение, которое содержит исключение, созданное одним из указанных делегатов.

Комментарии

Эта перегрузка предоставляется для сценариев, в которых требуется переопределить схему секционирования по умолчанию. Например, небольшие тела цикла могут воспользоваться преимуществами секционирования диапазона. Метод Parallel.ForEach ожидает, что пользовательские секционеры будут поддерживать динамическое секционирование. Дополнительные сведения см. в разделах Пользовательские секционаторы для PLINQ и TPL и Практическое руководство. Реализация динамических секций.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(Partitioner<TSource>, ParallelOptions, Action<TSource>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций и настройки параметров цикла.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Concurrent.Partitioner<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource> body);

Параметры типа

TSource

Тип элементов в объекте source.

Параметры

source
Partitioner<TSource>

Разделитель, содержащий исходный источник данных.

parallelOptions
ParallelOptions

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

body
Action<TSource>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Токен CancellationToken в аргументе parallelOptions отменен.

CancellationTokenSource, связанный с CancellationToken в parallelOptions, удален.

Аргумент source имеет значение null.

-или-

Аргумент parallelOptions имеет значение null.

-или-

Аргумент body имеет значение null.

Свойство SupportsDynamicPartitions в разделителе source возвращает false.

-или-

Исключение, которое возникает, когда какие-либо методы в разделителе source возвращают значение null.

Исключение, которое содержит исключение, созданное одним из указанных делегатов.

Комментарии

Эта перегрузка предоставляется для сценариев, в которых требуется переопределить схему секционирования по умолчанию. Например, небольшие тела цикла могут воспользоваться преимуществами секционирования диапазона. Метод Parallel.ForEach ожидает, что пользовательские секционеры будут поддерживать динамическое секционирование. Дополнительные сведения см. в разделах Пользовательские секционаторы для PLINQ и TPL и Практическое руководство. Реализация динамических секций.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(IEnumerable<TSource>, ParallelOptions, Action<TSource,ParallelLoopState,Int64>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) с 64-разрядными индексами для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Generic.IEnumerable<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource,System.Threading.Tasks.ParallelLoopState,long> body);

Параметры типа

TSource

Тип данных в источнике.

Параметры

source
IEnumerable<TSource>

Перечислимый источник данных.

parallelOptions
ParallelOptions

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

body
Action<TSource,ParallelLoopState,Int64>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Токен CancellationToken в аргументе parallelOptions отменен

Аргумент source имеет значение null.

-или-

Аргумент parallelOptions имеет значение null.

-или-

Аргумент body имеет значение null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

CancellationTokenSource, связанный с CancellationToken в parallelOptions, удален.

Комментарии

Делегат body вызывается один раз для каждого элемента в source перечисляемом объекте . Он предоставляется со следующими параметрами: текущий элемент, экземпляр, ParallelLoopState который может использоваться для преждевременного выхода из цикла, и индекс текущего элемента (Int64).

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(Partitioner<TSource>, Action<TSource,ParallelLoopState>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Concurrent.Partitioner<TSource> source, Action<TSource,System.Threading.Tasks.ParallelLoopState> body);

Параметры типа

TSource

Тип элементов в объекте source.

Параметры

source
Partitioner<TSource>

Разделитель, содержащий исходный источник данных.

body
Action<TSource,ParallelLoopState>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент body имеет значение null.

Свойство SupportsDynamicPartitions в разделителе source возвращает false.

-или-

Метод в разделителе source возвращает null.

-или-

Метод GetPartitions(Int32) в разделителе source не возвращает правильное число разделов.

Исключение, которое содержит исключение, созданное одним из указанных делегатов.

Комментарии

Эта перегрузка предоставляется для сценариев, в которых требуется переопределить схему секционирования по умолчанию. Например, небольшие тела цикла могут воспользоваться преимуществами секционирования диапазона. Метод Parallel.ForEach ожидает, что пользовательские секционеры будут поддерживать динамическое секционирование. Дополнительные сведения см. в разделах Пользовательские секционаторы для PLINQ и TPL и Практическое руководство. Реализация динамических секций.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(Partitioner<TSource>, Action<TSource>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Concurrent.Partitioner<TSource> source, Action<TSource> body);

Параметры типа

TSource

Тип элементов в объекте source.

Параметры

source
Partitioner<TSource>

Разделитель, содержащий исходный источник данных.

body
Action<TSource>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент body имеет значение null.

Свойство SupportsDynamicPartitions в разделителе source возвращает false.

-или-

Исключение, которое возникает, когда какие-либо методы в разделителе source возвращают значение null.

-или-

Метод GetPartitions(Int32) в разделителе source не возвращает правильное число разделов.

Исключение, которое содержит исключение, созданное одним из указанных делегатов.

Примеры

В следующем примере показано, как реализовать разделитель диапазона для использования с Parallel.ForEach:

using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

class RangePartitionerDemo 
{
        static void Main()
        {
            Stopwatch sw = null;

            long sum = 0;
            long SUMTOP = 10000000;

            // Try sequential for
            sw = Stopwatch.StartNew();
            for (long i = 0; i < SUMTOP; i++) sum += i;
            sw.Stop();
            Console.WriteLine("sequential for result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);

            // Try parallel for -- this is slow!
            //sum = 0;
            //sw = Stopwatch.StartNew();
            //Parallel.For(0L, SUMTOP, (item) => Interlocked.Add(ref sum, item));
            //sw.Stop();
            //Console.WriteLine("parallel for  result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);

            // Try parallel for with locals
            sum = 0;
            sw = Stopwatch.StartNew();
            Parallel.For(0L, SUMTOP, () => 0L, (item, state, prevLocal) => prevLocal + item, local => Interlocked.Add(ref sum, local));
            sw.Stop();
            Console.WriteLine("parallel for w/locals result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);

            // Try range partitioner
            sum = 0;
            sw = Stopwatch.StartNew();
            Parallel.ForEach(Partitioner.Create(0L, SUMTOP), (range) =>
            {
                long local = 0;
                for (long i = range.Item1; i < range.Item2; i++) local += i;
                Interlocked.Add(ref sum, local);
            });
            sw.Stop();
            Console.WriteLine("range partitioner result = {0}, time = {1} ms", sum, sw.ElapsedMilliseconds);
        }
}

Комментарии

Эта перегрузка предоставляется для сценариев, в которых требуется переопределить схему секционирования по умолчанию. Например, небольшие тела цикла могут воспользоваться преимуществами секционирования диапазона. Метод Parallel.ForEach ожидает, что пользовательские секционеры будут поддерживать динамическое секционирование. Дополнительные сведения см. в разделах Пользовательские секционаторы для PLINQ и TPL и Практическое руководство. Реализация динамических секций.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(IEnumerable<TSource>, Action<TSource,ParallelLoopState,Int64>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) с 64-разрядными индексами для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Generic.IEnumerable<TSource> source, Action<TSource,System.Threading.Tasks.ParallelLoopState,long> body);

Параметры типа

TSource

Тип данных в источнике.

Параметры

source
IEnumerable<TSource>

Перечислимый источник данных.

body
Action<TSource,ParallelLoopState,Int64>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент body имеет значение null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Комментарии

Делегат body вызывается один раз для каждого элемента в source перечисляемом объекте . Он предоставляется со следующими параметрами: текущий элемент, экземпляр, ParallelLoopState который может использоваться для преждевременного выхода из цикла, и индекс текущего элемента (Int64).

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(OrderablePartitioner<TSource>, Action<TSource,ParallelLoopState,Int64>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) для объекта OrderablePartitioner<TSource>, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Concurrent.OrderablePartitioner<TSource> source, Action<TSource,System.Threading.Tasks.ParallelLoopState,long> body);

Параметры типа

TSource

Тип элементов в объекте source.

Параметры

source
OrderablePartitioner<TSource>

Упорядочиваемый разделитель, содержащий исходный источник данных.

body
Action<TSource,ParallelLoopState,Int64>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент body имеет значение null.

Свойство SupportsDynamicPartitions в упорядочиваемом разделителе source возвращает значение false.

-или-

Свойство KeysNormalized в упорядочиваемом разделителе источника возвращает значение false.

-или-

Все методы в упорядочиваемом модуле разделения источника возвращают null.

Исключение, порождаемое одним из указанных делегатов.

Комментарии

Эта перегрузка предоставляется для сценариев, в которых требуется переопределить схему секционирования по умолчанию. Например, небольшие тела цикла могут воспользоваться преимуществами секционирования диапазона. Метод Parallel.ForEach ожидает, что пользовательские секционеры будут поддерживать динамическое секционирование. Дополнительные сведения см. в разделах Пользовательские секционаторы для PLINQ и TPL и Практическое руководство. Реализация динамических секций.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(IEnumerable<TSource>, Action<TSource>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Generic.IEnumerable<TSource> source, Action<TSource> body);

Параметры типа

TSource

Тип данных в источнике.

Параметры

source
IEnumerable<TSource>

Перечислимый источник данных.

body
Action<TSource>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент body имеет значение null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Примеры

В следующем примере метод используется ForEach<TSource>(IEnumerable<TSource>, Action<TSource>) для подсчета количества гласных и символов, не являющихся пробелами, в текстовом файле. В этом случае значение, возвращаемое методом , ParallelLoopResult игнорируется. Обратите внимание, что поскольку операции могут выполняться параллельно, необходимо убедиться, что увеличение переменных счетчика является атомарной операцией и что несколько потоков не пытаются получить доступ к переменным счетчика одновременно. Для этой цели в примере используется lock оператор (в C#) и SyncLock оператор (в Visual Basic).

using System;
using System.IO;
using System.Threading.Tasks;

public class Example
{
   public static void Main()
   {
      Task<String> task = ReadCharacters(@".\CallOfTheWild.txt");
      String text = task.Result;
      
      int nVowels = 0;
      int nNonWhiteSpace = 0;
      Object obj = new Object();

      ParallelLoopResult result = Parallel.ForEach(text, 
                                                   (ch) => {
                                                      Char uCh = Char.ToUpper(ch);
                                                      if ("AEIOUY".IndexOf(uCh) >= 0) {
                                                         lock (obj) {
                                                            nVowels++;
                                                         }
                                                      }
                                                      if (! Char.IsWhiteSpace(uCh)) {
                                                         lock (obj) {
                                                            nNonWhiteSpace++;
                                                         }   
                                                      }
                                                   } );
      Console.WriteLine("Total characters:      {0,10:N0}", text.Length);
      Console.WriteLine("Total vowels:          {0,10:N0}", nVowels);
      Console.WriteLine("Total non-white-space:  {0,10:N0}", nNonWhiteSpace);
   }

   private static async Task<String> ReadCharacters(String fn)
   {
      String text;
      using (StreamReader sr = new StreamReader(fn)) {
         text = await sr.ReadToEndAsync();
      }
      return text;
   }
}
// The example displays output like the following:
//       Total characters:         198,548
//       Total vowels:              58,421
//       Total non-white-space:     159,461

Комментарии

Делегат body вызывается один раз для каждого элемента в source перечисляемом объекте . Он предоставляется с текущим элементом в качестве параметра.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(Partitioner<TSource>, ParallelOptions, Action<TSource,ParallelLoopState>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) для объекта Partitioner, обеспечивая возможность параллельного выполнения итераций, настройки параметров цикла, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Concurrent.Partitioner<TSource> source, System.Threading.Tasks.ParallelOptions parallelOptions, Action<TSource,System.Threading.Tasks.ParallelLoopState> body);

Параметры типа

TSource

Тип элементов в объекте source.

Параметры

source
Partitioner<TSource>

Разделитель, содержащий исходный источник данных.

parallelOptions
ParallelOptions

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

body
Action<TSource,ParallelLoopState>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Токен CancellationToken в аргументе parallelOptions отменен.

CancellationTokenSource, связанный с CancellationToken в parallelOptions, удален.

Аргумент source имеет значение null.

-или-

Аргумент parallelOptions имеет значение null.

-или-

Аргумент body имеет значение null.

Свойство SupportsDynamicPartitions в разделителе source возвращает false.

-или-

Исключение, которое возникает, когда какие-либо методы в разделителе source возвращают значение null.

Исключение, которое содержит исключение, созданное одним из указанных делегатов.

Комментарии

Эта перегрузка предоставляется для сценариев, в которых требуется переопределить схему секционирования по умолчанию. Например, небольшие тела цикла могут воспользоваться преимуществами секционирования диапазона. Метод Parallel.ForEach ожидает, что пользовательские секционеры будут поддерживать динамическое секционирование. Дополнительные сведения см. в разделах Пользовательские секционаторы для PLINQ и TPL и Практическое руководство. Реализация динамических секций.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0

ForEach<TSource>(IEnumerable<TSource>, Action<TSource,ParallelLoopState>)

Исходный код:
Parallel.cs
Исходный код:
Parallel.cs
Исходный код:
Parallel.cs

Выполняет операцию foreach (For Each в Visual Basic) для объекта IEnumerable, обеспечивая возможность параллельного выполнения итераций, а также контроля состояния цикла и управления этим состоянием.

public static System.Threading.Tasks.ParallelLoopResult ForEach<TSource> (System.Collections.Generic.IEnumerable<TSource> source, Action<TSource,System.Threading.Tasks.ParallelLoopState> body);

Параметры типа

TSource

Тип данных в источнике.

Параметры

source
IEnumerable<TSource>

Перечислимый источник данных.

body
Action<TSource,ParallelLoopState>

Делегат, который вызывается один раз за итерацию.

Возвращаемое значение

Структура, в которой содержатся сведения о выполненной части цикла.

Исключения

Аргумент source имеет значение null.

-или-

Аргумент body имеет значение null.

Исключение, которое содержит все отдельные исключения, создаваемые во всех потоках.

Комментарии

Делегат body вызывается один раз для каждого элемента в source перечисляемом объекте . Он предоставляется со следующими параметрами: текущим элементом и экземпляром ParallelLoopState , который может использоваться для преждевременного выхода из цикла.

См. также раздел

Применяется к

.NET 9 және басқа нұсқалар
Өнім Нұсқалар
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1
UWP 10.0