Продолжения и исключения




Продолжение может определить, было ли сгенерировано исключение родительской задачей, с помощью свойства Exception родительской задачи. Следующий фрагмент кода будет выводить подробную информацию об исключении NullReferenceException:

Task task1 = Task.Factory.StartNew (() => { throw null; });

Task task2 = task1.ContinueWith (main => Console.Write (main.Exception));


увеличить изображение
Рис. 7.9. Результат выполнения программы с использование продолжения и обработки исключения NullReferenceException

Продолжения и дочерние задачи

Одной из ключевых возможностей использования продолжения является то, что оно будет выполняться только после завершения дочерних задач. При этом любое исключение, генерируемое дочерней задачей, будет передаваться в задачу-продолжение:

TaskCreationOptions main = TaskCreationOptions.AttachedToParent;

Task.Factory.StartNew (() =>

{

Task.Factory.StartNew (() => { throw null; }, main);

Task.Factory.StartNew (() => { throw null; }, main);

Task.Factory.StartNew (() => { throw null; }, main);

})

.ContinueWith (p => Console.WriteLine (p.Exception),

TaskContinuationOptions.OnlyOnFaulted);


увеличить изображение
Рис. 7.10. Результат выполнения программы с использование продолжения и дочерних задач

Продолжения предыдущих задач

Метод ContinueWhenAll() используется для того, что бы выполнить продолжение конкретной задачи, после выполнения нескольких предыдущих задач:

Task<int> task1 = Task.Factory.StartNew (() => 200);

Task<int> task2 = Task.Factory.StartNew (() => 200);

 

Task<int> task3 = Task<int>.Factory.ContinueWhenAll (

new[] { task1, task2 }, tasks => tasks.Sum (t => t.Result));

Console.WriteLine (task3.Result);


увеличить изображение
Рис. 7.11. Результат выполнения программы с использование метода Метод ContinueWhenAll()

Несколько продолжений одной задачи

Метод ContinueWith() позволяет создавать несколько продолжений одной задачи. Когда предыдущая задача завершается, все продолжения запускаются одновременно. Пример использования метода ContinueWith()представлен ниже:

var t = Task.Factory.StartNew (() => Thread.Sleep (1000));

t.ContinueWith (main => Console.Write ("X"));

t.ContinueWith (main => Console.Write ("Y"));


увеличить изображение
Рис. 7.12. Результат выполнения программы с использование метода ContinueWith()

Планировщики заданий и пользовательский интерфейс

Планировщик задач (task scheduler) назначает задания определенным потокам. Все задания связаны с определенным планировщиком, который представлен абстрактным классом TaskScheduler.. Net Framework предоставляет две конкретные реализации:

· Планировщик по умолчанию (default scheduler), который работает совместно с пулом потоков CLR;

· Планировщик контекста синхронизации (synchronization context scheduler), который предназначен для упрощения работы с WPF и Windows Forms, которые требуют, чтобы обращение к элементам пользовательского интерфейса и элементам управления происходило только из потока, в котором они были созданы.

Что бы в фоновом режиме получить данные от Web-сервиса и затем, на основе полученных результатов, обновить метку (label) с именем lblResult. Разбиваем эту задачу на две подзадачи:

1. Вызвать метод для получения данных от Web-сервиса (родительская задача).

2. Обновить lblResult на основе полученных результатов (задача-продолжение).

Если указать для задачи-продолжения планировщик контекста синхронизации, полученный при создании окна, можно обновить lblResult:

public partial class MyWindow: Window

{

TaskScheduler _uiScheduler; // Объявляем TaskScheduler

public MyWindow()

{

InitializeComponent();

 

_uiScheduler = TaskScheduler.

FromCurrentSynchronizationContext();

 

Task.Factory.StartNew<string> (SomeComplexWebService)

.ContinueWith (main => lblResult.Content = main.Result, _uiScheduler);

}

 

string SomeComplexWebService() {... }

}

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: