Создание вложенных задач
Вложенные задача - это экземпляр задачи Task, создаваемый в пользовательском делегате другой задачи. Дочерняя задача - это вложенная задача, создаваемая с помощью параметра AttachedToParent. Задача может создать любое количество дочерних и вложенных задач, ограничиваясь только системными ресурсами. Пример кода, демонстрирующий создание вложенных задач, представлен ниже:
Task parent = Task.Factory.StartNew(() =>
{
Console.WriteLine("Родительская задача запущена");
Task.Factory.StartNew(() => // Дочерняя задача
{
Console.WriteLine("Дочерняя задача запущена");
Thread.SpinWait(5000000);
Console.WriteLine("Дочерняя задача выполнена");
});
});
parent.Wait();
Console.WriteLine("Родительская задача выполнена");
увеличить изображение
Рис. 7.3.Результат выполнения программы с использованием дочерних задач
Наиболее важным моментом при сравнении дочерних и вложенных задач является то, что вложенные задачи по существу не зависят от родительской или внешней задачи, тогда как вложенные дочерние задачи синхронизируются с родительской задачей. Если изменить оператор создания задач так, чтобы использовался параметр AttachedToParent, как показано в следующем примере:
Task parent = Task.Factory.StartNew(() =>
{
Console.WriteLine("Родительская задача запущена");
Task.Factory.StartNew(() => // Дочерняя задача
{
Console.WriteLine("Дочерняя задача запущена");
Thread.SpinWait(5000000);
Console.WriteLine("Дочерняя задача выполнена");
}, TaskCreationOptions.AttachedToParent);
});
parent.Wait();
Console.WriteLine("Родительская задача выполнена");
увеличить изображение
Рис. 7.4.Результат выполнения программы с использованием дочерних задач и параметра AttachedToParent
Ожидание задач
Возможно, осуществлять ожидание выполнения задач двумя различными способами:
· С помощью метода Wait(). Один из возможных форматов объявления этого метода представлен ниже:
public Wait(TimeSpan timeout)
где timeout - время ожидания в миллисекундах.
· C помощью обращения к свойству Result (свойство класса Task<TResult>):
public TResult Result;
Можно также одновременно ожидать завершения нескольких задач с помощью метода Task.WaitAll() который ожидает завершения всех указанных задач и метода Task.WaitAny() который ожидает завершения какой-либо задачи. Форматы объявления этих методов представлены ниже:
Public static void WaitAll(Task[]);
Public static void WaitAny(Task[]);
где Task[] - массив экземпляров класса Task.
Метод WaitAll() ожидает выполнение всех остальных задач, по завершению работы задач вызывает исключение типа AggregateException, которое содержит все исключения неудачно завершившихся задач.
Вызов метода WaitAny() эквивалентен ожиданию ManualResetEventSlim, который переводится в сигнальное состояние при завершении конкретной задачи.
Дата добавления: 2017-06-02; просмотров: 311;