// Прервать цикл при обнаружении отрицательного значения, if(data[i] < 0) pis.Break();
data[i] = data[i] / 10;
if(data[i] < 1000) data[i] = 0;
if(data[i] > 1000 & data[i] < 2000) data[i] = 100; if(data[i] > 2000 & data[i] < 3000) data[i] = 200; if(data[i] > 3000) data[i] = 300;
}
static void Main() {
Console.WriteLine("Основной поток запущен."); data = new int[100000000];
// Инициализировать данные.
for(int i=0; i < data.Length; i++) data[i] = i;
// Поместить отрицательное значение в массив data, data[1000] = -10;
// Параллельный вариант инициализации массива в цикле.
ParallelLoopResult loopResult = Parallel.For(0, data.Length, MyTransform);
// Проверить, завершился ли цикл, if(!loopResult.IsCompleted)
Console.WriteLine("\пЦикл завершился преждевременно из-за того, " +
"что обнаружено отрицательное значение\п" +
"на шаге цикла номер " +
loopResult.LowestBreaklteration + ".\n");
Console.WriteLine("Основной поток завершен.");
}
}
Выполнение этой программы может привести, например, к следующему результату.
Основной поток запущен.
Цикл завершился преждевременно из-за того, что обнаружено отрицательное значение на шаге цикла номер 1000
Основной поток завершен.
Как следует из приведенного выше результата, цикл преобразования данных преждевременно завершается после 1000 шагов. Дело в том, что методBreak() вызывается внутри методаMyTransform() при обнаружении в массиве данных отрицательного значения.
Помимо двух описанных выше форм методаFor() существует и ряд других его форм. В одних из этих форм допускается указывать различные дополнительные параметры, а в других — использовать параметры типаlongвместоintдля пошагового выполнения цикла. Имеются также формы методаFor (), предоставляющие такие дополнительные преимущества, как, например, возможность указывать метод, вызываемый по завершении потока каждого цикла.
И еще одно, последнее замечание: если требуется остановить цикл, параллельно выполняемый методомFor (), не обращая особого внимания на любые шаги цикла, которые еще могут быть в нем выполнены, то для этой цели лучше воспользоваться методомStop (), чем методомBreak ().
Применение метода ForEach ()
Используя методForEach(), можно создать распараллеливаемый вариант циклаforeach.Существует несколько форм методаForEach (). Ниже приведена простейшая форма его объявления:
public static ParallelLoopResult
ForEach
Action