Свойство IsCompleted
true
, если выполнены все шаги цикла. Иными словами, при нормальном завершении цикла это свойство будет содержать логическое значение true
. Если же выполнение цикла прервется раньше времени, то данное свойство будет содержать логическое значение false
. Свойство LowestBreaklteration
будет содержать наименьшее значение переменной управления циклом, если цикл прервется раньше времени вызовом метода ParallelLoopState.Break()
.Для доступа к объекту типа ParallelLoopState
For()
, делегат которого принимает в качестве второго параметра текущее состояние цикла. Ниже эта форма метода For()
приведена в простейшем виде.public static ParallelLoopResult For(int fromlnclusive, int toExclusive,
Action
В данной форме делегат Action
public delegate void Action
Для метода For()
int
, а обобщенный параметр Т2 — типа ParallelLoopState
. Всякий раз, когда делегат Action вызывается, текущее состояние цикла передается в качестве аргумента Для преждевременного завершения цикла следует воспользоваться методом Break()
ParallelLoopState
внутри тела цикла, определяемого параметром Break()
объявляется следующим образом.Вызов метода Break()
Break()
. Но все шаги цикла до вызова метода Break()
все же выполняются. Следует, также иметь в виду, что отдельные части цикла могут и не выполняться параллельно. Так, если выполнено 10 шагов цикла, то это еще не означает, что все эти 10 шагов представляют 10 первых значений переменной управления циклом.Прерывание цикла, параллельно выполняемого методом For()
В приведенном ниже примере программы демонстрируется применение метода Break()
For()
. Это вариант предыдущего примера, переработанный таким образом, чтобы метод MyTransform()
принимал теперь объект типа ParallelLoopState
в качестве своего параметра, а метод Break()
вызывался при обнаружении отрицательного значения в массиве данных. Отрицательное значение, по которому прерывается выполнение цикла, вводится в массив data внутри метода Main()
. Далее проверяется состояние завершения цикла преобразования данных. Свойство IsCompleted
будет содержать логическое значение false
, поскольку в массиве data
обнаруживается отрицательное значение. При этом на экран выводится номер шага, на котором цикл был прерван. (В этой программе исключены все избыточные циклы, применявшиеся в ее предыдущей версии, а оставлены только самые эффективные из них: последовательно выполняемый цикл инициализации и параллельно выполняемый цикл преобразования.)// Использовать объекты типа ParallelLoopResult и ParallelLoopState, а также
// метод Break() вместе с методом For() для параллельного выполнения цикла.
using System;
using System.Threading.Tasks;
class DemoParallelForWithLoopResult {
static int[] data;
// Метод, служащий в качестве тела параллельно выполняемого цикла.
//Операторы этого цикла просто расходуют время ЦП для целей демонстрации,
static void MyTransform(int i, ParallelLoopState pis) {
// Прервать цикл при обнаружении отрицательного значения,
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() {