Отмена выполнения задач
Отмена выполнения заданий осуществляется с помощью специальных маркеров отмены (token). Структура CancellationToken - распространяет уведомление о том, что операции следует отменить. При запуске задачи можно передать маркер отмены, что позволит отменить выполнение задачи:
CancellationTokenSource cancelSource = new CancellationTokenSource();
CancellationToken token = cancelSource.Token;
Task task = Task.Factory.StartNew (() =>
{
token.ThrowIfCancellationRequested(); // Проверяем запрос отмены
}, token);
...
cancelSource.Cancel();
Для отмененной задачи вызывается исключение - AggregateException, которое необходимо обработать и проверить следующим образом:
try
{
task.Wait();
}
catch (AggregateException ex)
{
if (ex.InnerException is OperationCanceledException)
Console.Write ("Задание отменено");
}
увеличить изображение
Рис. 7.6.Результат выполнения программы с использованием отмены задачи
Продолжения
Для того что бы упорядочить выполнение задач в программе, т.е. к примеру что бы Задача 3 выполнялась сразу же после выполнения Задачи 2, а Задача 2 после завершения Задачи 1, необходимо использовать методContinueWith() класса - Task. Форма объявление данного метода представлена ниже:
public Task ContinueWith(Action<Task>)
Пример работы метода ContinueWith() представлен ниже:
Task task1 = Task.Factory.StartNew (() => Console.Write ("Hello "));
Task task2 = task1.ContinueWith (main => Console.Write ("World!"));
где main - аргумент, который передается в задачу-продолжение в лямбда-выражении, является ссылкой на родительскую задачу.
увеличить изображение
Рис. 7.7.Результат выполнения программы с использование метода ContinueWith()
Продолжения и Task <TResult>
В классе Task<TResult>, также можно использовать продолжение и возвращать некоторые данные, с использованием последовательности вычисления:
Task.Factory.StartNew<int>(() => 10)
.ContinueWith(main => main.Result * 2)
.ContinueWith(main => Math.Sqrt(main.Result))
.ContinueWith(main => Console.WriteLine(main.Result));
увеличить изображение
Рис. 7.8.Результат выполнения программы с использование продолжения в классе Task<TResult>
Дата добавления: 2017-06-02; просмотров: 263;