![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Обработка исключений и отмена выполнения задач
Создание параллельных приложений требует особых подходов при обработке исключительных ситуаций и прерывании работы задач. Исключительные ситуации могут возникнуть одновременно в разных потоках, а их обработка может выполняться в отдельном потоке. Задачи могут образовывать цепочку выполнения, а, значит, отмена одной задачи должна вести к отмене всех следующих задач цепочки. В библиотеке параллельных расширений используются следующие принципы работы с исключительными ситуациями: – при возникновении исключения в задаче (как созданной явно, так и порождённой неявно, например, методом Parallel.For()) это исключение обрабатывается средствами библиотеки (если перехват не был предусмотрен программистом) и направляется в ту задачу, которая ожидает завершения данной; – при параллельном возникновении нескольких исключений все они собираются в единое исключение System.AggregateException, которое переправляется далее по цепочке вызовов задач; – если возникла в точности одна исключительная ситуация, то на её основе будет создан объект AggregateException в целях единообразной обработки всех исключительных ситуаций. Исключительные ситуации типа AggregateException могут возникать при работе со следующими конструкциями библиотеки параллельных расширений: 1. Класс Task – исключения, возникшие в теле задачи, будут повторно возбуждены в месте вызова метода Wait() данной задачи. Кроме того, исключение доступно через свойство Exception объекта Task. 2. Класс Task< T> – исключения, возникшие в теле задачи, будут повторно возбуждены в месте вызова метода Wait() или в месте обращения к экземплярному свойству Task< T>.Result. 3. Класс Parallel – исключения могут возникнуть в параллельно исполняемых итерациях циклов Parallel.For() и Parallel.ForEach() или в параллельных блоках кода при работе с Parallel.Invoke(). 4. PLINQ – из-за отложенного характера исполнения запросов, исключения обычно возникают на этапе перебора элементов, полученных по запросу. В библиотеке параллельных расширений применяется особый подход для выполнения отмены задач. Отметим, что многие методы задач, упоминавшиеся выше, принимают в качестве аргумент значение типа CancellationToken. Это так называемый токен отмены – своеобразный маркер того, что задачу можно отменить. Класс System.Threading.CancellationTokenSource содержит свойство Token для получения токенов отмены и метод Cancel() для отмены выполнения всех задач, использующих общий токен. В следующем фрагменте кода демонстрируется типичный сценарий использования токенов отмены: вначале создаётся CancellationToken, затем его токен назначается задачам, а потом вызывается метод Cancel(), прерывающий выполнение всех задач: // создаём токен и используем его в двух задачах var token = new CancellationTokenSource();
// используем токен в двух задачах new Task(SomeMethod, token.Token).Start(); Task.Factory.StartNew(OtherMethod, token.Token);
// в нужный момент отменяем обе задачи token.Cancel();
|