Читаем C# 4.0: полное руководство полностью

    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("\nЦикл завершился преждевременно из-за того, " +

            "что обнаружено отрицательное значение" +

            "на шаге цикла номер " +

            loopResult.LowestBreakIteration + ".\n");

    Console.WriteLine("Основной поток завершен.");

  }

}

Выполнение этой программы может привести, например, к следующему результату.

Основной поток запущен.

Цикл завершился преждевременно из-за того, что обнаружено отрицательное значение на шаге цикла номер 1000

Основной поток завершен.

Как следует из приведенного выше результата, цикл преобразования данных преждевременно завершается после 1000 шагов. Дело в том, что метод Break() вызывается внутри метода MyTransform() при обнаружении в массиве данных отрицательного значения.

Помимо двух описанных выше форм метода For() существует и ряд других его форм. В одних из этих форм допускается указывать различные дополнительные параметры, а в других — использовать параметры типа long вместо int для пошагового выполнения цикла. Имеются также формы метода For(), предоставляющие такие дополнительные преимущества, как, например, возможность указывать метод, вызываемый по завершении потока каждого цикла.

И еще одно, последнее замечание: если требуется остановить цикл, параллельно выполняемый методом For(), не обращая особого внимания на любые шаги цикла, которые еще могут быть в нем выполнены, то для этой цели лучше воспользоваться методом Stop(), чем методом Break().

Применение метода ForEach()

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

public static ParallelLoopResult

      ForEach(IEnumerable source,

               Action body)

где source обозначает коллекцию данных, обрабатываемых в цикле, a body — метод, который будет выполняться на каждом шаге цикла. Как пояснялось ранее в этой книге, во всех массивах, коллекциях (описываемых в главе 25) и других источниках данных поддерживается интерфейс IEnumerable. Метод, передаваемый через параметр body, принимает в качестве своего аргумента значение или ссылку на каждый обрабатываемый в цикле элемент массива, но не его индекс. А в итоге возвращаются сведения о состоянии цикла.

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

public static ParallelLoopResult

      ForEach(IEnumerable source,

          Action body)

В приведенном ниже примере программы демонстрируется применение метода ForEach() на практике. Как и прежде, в данном примере создается крупный массив целых значений. А отличается данный пример от предыдущих тем, что метод, выполняющийся на каждом шаге цикла, просто выводит на консоль значения из массива. Как правило, метод WriteLine() в распараллеливаемом цикле не применяется, потому что ввод-вывод на консоль осуществляется настолько медленно, что цикл оказывается полностью привязанным к вводу-выводу. Но в данном примере метод WriteLine() применяется исключительно в целях демонстрации возможностей метода ForEach(). При обнаружении отрицательного значения выполнение цикла прерывается вызовом метода Break(). Несмотря на то что метод Break() вызывается в одной задаче, другая задача может по-прежнему выполняться в течение нескольких шагов цикла, прежде чем он будет прерван, хотя это зависит от конкретных условий работы среды выполнения.

Перейти на страницу:

Похожие книги

1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT
Adobe InDesign CS3
Adobe InDesign CS3

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

Программирование, программы, базы данных / Программное обеспечение / Книги по IT
Разработка приложений в среде Linux. Второе издание
Разработка приложений в среде Linux. Второе издание

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет СЃРѕР±РѕР№ отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из РґСЂСѓРіРёС… операционных систем. РџРѕРґСЂРѕР±но рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование СЃРІРѕР±одно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Р

Майкл К. Джонсон , Эрик В. Троан

Программирование, программы, базы данных