Создание вложенных задач

Вложенные задача - это экземпляр задачи 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;


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

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.005 сек.