Глава.27 .Асинхронные.вычислительные.операции
Узнать, на какой стадии своего жизненного цикла находится задание, можно при
помощи предназначенного только для чтения свойства
Status
объекта
Task
. Оно
возвращает значение
TaskStatus
, которое определяется следующим образом:
public enum TaskStatus {
// Флаги, обозначающие состояние задания:
Created, // Задание создано в явном виде
// и может быть запущено вручную
WaitingForActivation, // Задание создано неявно
// и запускается автоматически
WaitingToRun, // Задание запланировано, но еще не запущено
Running, // Задание выполняется
// Задание ждет завершения дочерних заданий, чтобы завершиться
WaitingForChildrenToComplete,
// Возможные окончательные состояния задания:
RanToCompletion,
Canceled,
Faulted
}
Только что созданный объект
Task
имеет статус
Created
. Позднее, когда зада-
ние ставится в очередь на выполнение, его статус меняется на
WaitingToRun
. За-
пущенному заданию в потоке присваивается статус
Running
. Приостановленному
заданию, которое ожидает завершения дочерних заданий, соответствует статус
WaitingForChildrenToComplete
. Полностью завершенное задание имеет одно из
трех возможных состояний:
RanToCompletion
,
Canceled
или
Faulted
. Узнать ре-
зультат выполнения задания
Task
можно через его свойство
Result
. Если
выполнение задачи
Task
или
Task
прерывается, узнать, какое именно
необработанное исключение было вброшено, можно через свойство
Exception
объ-
екта
Task
; оно всегда возвращает объект
AggregateException
, коллекция которого
состоит из необработанных исключений.
Для удобства объект
Task
предоставляет набор предназначенных только для
чтения свойств типа
Boolean
:
IsCanceled
,
IsFaulted
и
IsCompleted
. Последнее
свойство возвращает значение
true
, если объект
Task
находится в состоянии
RanToCompleted
,
Canceled
или
Faulted
. Определить, успешно ли выполнено за-
дание, проще всего при помощи вот такого кода:
if (task.Status == TaskStatus.RanToCompletion) ...
Объект
Task
оказывается в состоянии
WaitingForActivation
, если он созда-
ется при помощи одной из следующих функций:
ContinueWith
,
ContinueWhenAll
,
ContinueWhenAny
или
FromAsync
. Задание, созданное путем конструирования
объекта
TaskCompletionSource
, также оказывается в состоянии
WaitingForActivation
. Это состояние означает, что планирование задания управ-
ляется его собственной инфраструктурой. К примеру, невозможно явным образом
767
Задания
запустить объект
Task
, созданный вызовом функции
ContinueWith
. Это задание
запустится автоматически после завершения предыдущего.
Do'stlaringiz bilan baham: |