Вопрос по Курсу: "Параллельное программирование с использованием MS VisualStudia 2010". При компиляции Самостоятельного задания (одновременная отрисовка прямоугольников, эллипсов и выдача в текст-бокс случайного числа) среда предупреждает: suspend - устаревшая команда; примените monitor, mutex и т.п. Создаётся впечатление, что Задание создано в более поздней среде, чем VS 2010. |
Параллелизм данных
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();
увеличить изображение
Рис. 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(); });
увеличить изображение
Рис. 9.5. Результат работы программы с использованием метода Parallel.Foreach() и объекта ParallelLoopState
Для того что бы получить индекс параллельной версии цикла foreach используется следующая форма метода Parallel.Foreach():
public static ParallelLoopResult ForEach<TSource> (IEnumerable<TSource> source, Action<TSource,ParallelLoopState,long> body
Пример реализации метода Parallel.ForEach(), с использованием индексов цикла представлен ниже:
char[] data = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' }; ParallelLoopResult result = Parallel.ForEach(data, (l, state,i) => { Console.WriteLine(l+" "+i); });
увеличить изображение
Рис. 9.6. Результат работы программы с использованием метода Parallel.Foreach() и индексов цикла