Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Управление исключительными ситуациями при распараллеливании






Рассмотрим теперь пример, отражающий организацию обработки исключительных ситуаций, которые могут возникать в ходе выполнения параллельного цикла. Будем моделировать работу прибора, управляющего температурным режимом. Предполагается, что числа, появляющиеся на итерации, задают значение температуры. На итерации могут возникать исключения двух моделируемых нами типов. Если полученное значение температуры слишком велико, то " выбрасывается" исключение, свидетельствующее о " высокой температуре". В другой ситуации " выбрасывается" исключение, свидетельствующее о " низкой температуре".

Вот как устроен наш тест:

/// < summary>

/// Выбрасывание исключений и их обработка

/// < /summary>

static void HLTest()

{

ParallelLoopResult res = new ParallelLoopResult();

try

{

res = Parallel.For(0, n, Temperature);

}

catch (LowTemperatureException e)

{

Console.WriteLine(e.Message);

}

catch (HighTemperatureException e)

{

Console.WriteLine(e.Message);

}

 

catch (AggregateException ae)

{

Console.WriteLine(ae.Message);

ae.Handle((x) =>

{

if (x is HighTemperatureException)

{

Console.WriteLine(

" Агрегированное сообщение: Высокая температура");

return true;

}

else

if (x is LowTemperatureException)

{

Console.WriteLine(

" Агрегированное сообщение: Низкая температура");

return true;

}

else return false;

});

}

finally

{

Console.WriteLine(res.IsCompleted.ToString());

Console.WriteLine(res.LowestBreakIteration.ToString());

}

}

Метод Parallel.For помещается в try-блок. После try-блока следуют три catch-обработчика исключительной ситуации. Заметьте, первые два бесполезны, несмотря на то, что они пытаются перехватить фактически возникающие исключения. Дело в том, что при параллельном выполнении все исключения перехватываются и собираются в одно агрегированное исключение AggregateException, которое и перехватывает специальный catch-обработчик.

У объектов типа AggregateException есть замечательный метод Handle, позволяющий получить все исключения, возникшие на параллельно исполняемых итерациях цикла. Эти исключения можно тут же проанализировать и выполнить их обработку. Наш пример демонстрирует этот способ обработки исключений.

Давайте рассмотрим метод, выполняющий итерацию, в ходе которой и могут появляться исключения того или иного типа:

static void Temperature(int i, ParallelLoopState pls)

{

const int m = 1000;

//моделируем показания прибора

int N = rnd.Next(-m, m);

if (N > 777) throw new HighTemperatureException(

" Высокая температура");

if (N < -777) throw new LowTemperatureException(

" Низкая температура");

}






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.