Томский политехнический университет
Опубликован: 23.01.2013 | Доступ: свободный | Студентов: 1158 / 192 | Длительность: 12:09:00
Лекция 7:

Параллелизм данных

Parallel.ForEach

Метод Parallel.ForEach(), позволяет создавать распараллеленный вариант цикла foreach. Существует несколько форм метода Parallel.ForEach(). Одна из простых форм объявление данного метода приведена ниже:

ForEach<TSource>(IEnumerable<TSource> source, Action<TSource> body);

где source - обозначает коллекцию данных, обрабатываемых в цикле, body - метод, который будет выполняться на каждом шаге цикла.

Пример реализации метода Parallel.ForEach(), представлен ниже:

int[] data = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};

            
                Parallel.ForEach<int>(data, l =>
                {
                    Console.WriteLine(l);
                });
       
            Console.ReadLine();
 Результат работы программы с использованием метода Parallel.Foreach()

увеличить изображение
Рис. 9.4. Результат работы программы с использованием метода Parallel.Foreach()

Параллельное выполнение цикла методом Parallel.ForEach() также как и метод Parallel.For(), можно остановить, вызвав метод Break() для экземпляра объекта ParallelLoopState, передаваемого через параметр body, форма метода Parallel.Foreach() приведена ниже:

ForEach<TSource>(IEnumerable<TSource> source,Action<TSource, ParallelLoopState> body);

Пример реализации метода Parallel.ForEach(), с использованием объекта ParallelLoopState представлен ниже:

char[] data = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };

  ParallelLoopResult result =
                Parallel.ForEach(data, (l, state) =>
                {
                    
                    Console.WriteLine(l);
                  if (l == 'e') state.Break();
                   
                });
 Результат работы программы с использованием метода Parallel.Foreach() и  объекта ParallelLoopState

увеличить изображение
Рис. 9.5. Результат работы программы с использованием метода Parallel.Foreach() и объекта ParallelLoopState

Для того что бы получить индекс параллельной версии цикла foreach используется следующая форма метода Parallel.Foreach():

public static ParallelLoopResult ForEach<TSource> (IEnumerable<TSource> source, Action<TSource,ParallelLoopState,long> body

где long - индекс цикла.

Пример реализации метода Parallel.ForEach(), с использованием индексов цикла представлен ниже:

char[] data = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };

            ParallelLoopResult result =
                Parallel.ForEach(data, (l, state,i) =>
                {
                    Console.WriteLine(l+" "+i);
                });
 Результат работы программы с использованием метода Parallel.Foreach() и  индексов  цикла

увеличить изображение
Рис. 9.6. Результат работы программы с использованием метода Parallel.Foreach() и индексов цикла
Владимир Каширин
Владимир Каширин

Вопрос по Курсу: "Параллельное программирование с использованием MS VisualStudia 2010".

При компиляции Самостоятельного задания (одновременная отрисовка прямоугольников, эллипсов и выдача в текст-бокс случайного числа) среда предупреждает: suspend - устаревшая команда; примените monitor, mutex и т.п.

Создаётся впечатление, что Задание создано в более поздней среде, чем VS 2010.