765
Задания
структура задания
Каждый объект
Task
состоит из набора полей, определяющих состояние задания.
В их число входят: идентификатор типа
Int32
(предназначенное только для чтения
свойство
Id
объекта
Task
), значение типа
Int32
, представляющее состояние выпол-
нения задания, ссылка на родительское задание, ссылка на объект
TaskScheduler
,
показывающий время создания задания, ссылка на метод обратного вызова, ссылка
на объект, который следует передать в метод обратного вызова (этот объект досту-
пен через предназначенное только для чтения свойство
AsyncState
объекта
Task
),
ссылка на класс
ExecutionContext
и ссылка на объект
ManualResetEventSlim
.
Кроме того, каждый объект
Task
имеет ссылку на дополнительное состояние, соз-
даваемое по требованию. Это дополнительное состояние включает в себя объект
CancellationToken
, коллекцию объектов
ContinueWithTask
, коллекцию объектов
Task
для дочерних заданий, ставших источником необработанных исключений,
и прочее в том же духе. За все эти возможности приходится платить, так как для
хранения каждого состояния требуется выделять место в памяти. Если дополнитель-
ные возможности вам не нужны, для более эффективного расходования ресурсов
рекомендуем воспользоваться методом
ThreadPool.QueueUserWorkItem
.
Классы
Task
и
Task
реализуют интерфейс
IDisposable
, что позволяет
после завершения работы с объектом
Task
вызвать метод
Dispose
. Пока что этот
метод всего лишь закрывает объект
ManualResetEventSlim
, но можно определить
классы, производные от
Task
и
Task
, которые будут выделять свои ресур-
сы, освобождаемые при помощи переопределенного метода
Dispose
. Разумеется,
разработчики практически никогда не вызывают метод
Dispose
для объекта
Task
;
они просто позволяют уборщику мусора удалить освободившиеся ресурсы.
Как легко заметить, у каждого объекта
Task
есть поле типа
Int32
, содержащее
уникальный идентификатор задания. При создании объекта это поле инициализи-
руется нулем. При первом обращении к свойств
Id
(доступному только для чтения)
в поле заносится значение типа
Int32
, которое и возвращается в качестве результата
запроса. Нумерация идентификаторов начинается с единицы и увеличивается на
единицу с каждым следующим присвоенным идентификатором. Чтобы заданию был
присвоен идентификатор, достаточно открыть объект
Task
в отладчике Microsoft
Visual Studio.
Идентификаторы были введены для того, чтобы каждому заданию соответство-
вал уникальный номер. В Visual Studio идентификаторы можно увидеть в окнах
Parallel
Tasks
и
Parallel
Stacks
. Но так как присвоение идентификаторов происходит
автоматически, практически невозможно понять, какие значения к каким заданиям
относятся. Тем не менее можно обратиться к статическому свойству
CurrentId
объекта
Task
, которое возвращает значение типа
Int32
, допускающего присвоение
значений
null
(
Int32?
). Узнать идентификатор кода, отладка которого происходит
в данный момент, можно также в окнах Visual Studio
Watch
и
Immediate
. После этого
остается найти это задание в окне
Parallel
Tasks
или
Parallel
Stacks
. Если же запросить
свойство
CurrentId
для задания, которое не выполняется, возвращается
null
.
766
Do'stlaringiz bilan baham: |