Пользовательское составное действие, использующее собственное действие
Данный раздел относится к версии Windows Workflow Foundation 4.
В этом образце показано, как разработать действие NativeActivity, которое планирует другие объекты Activity для управления потоком выполнения рабочего процесса. В этом образце используются два общих потока управления, Sequence и While, для демонстрации того, как это сделать.
Подробные сведения об образце
Начиная с MySequence
, прежде всего следует отметить, что он является производным от объекта NativeActivity. NativeActivity является объектом Activity, который предоставляет доступ ко всем возможностям среды ActivityRuntime с помощью контекста NativeActivityContext, переданного методу Execute
.
Действие MySequence
предоставляет доступ к общедоступной коллекции объектов Activity, которая заполняется разработчиком рабочего процесса. Перед выполнением рабочего процесса среда выполнения рабочего процесса вызывает метод CacheMetadata для каждого действия в рабочем процессе. В ходе этого процесса среда выполнения определяет связи типа «родитель-потомок» в целях управления областью определения данных и временем существования. В реализации метода CacheMetadata по умолчанию используется класс экземпляра TypeDescriptor для действия MySequence
в целях добавления любого общедоступного свойства типа Activity или IEnumerable<Activity> в качестве дочернего для действия MySequence
.
Каждый раз, когда действие предоставляет доступ к общедоступной коллекции дочерних действий, возникает вероятность того, что эти дочерние действия будут приобретать одинаковое состояние. Рекомендуется, чтобы родительское действие, в данном случае MySequence
, также предоставляло доступ к коллекции переменных, с помощью которых дочерние действия могли бы это осуществить. По аналогии с дочерними действиями метод CacheMetadata добавляет общедоступные свойства типа Variable или IEnumerable<Variable> в качестве переменных, которые связаны с действием MySequence
.
Помимо общедоступных переменных, которыми управляют действия, дочерние по отношению к MySequence
, действие MySequence
должно также следить, где оно находится с точки зрения выполнения его дочерних действий. Для этого в нем используется закрытая переменная currentIndex
. Эта переменная регистрируется как часть среды MySequence
путем добавления вызова метода AddImplementationVariable в метод CacheMetadata действия MySequence
. Объекты Activity, добавленные в коллекцию MySequence
Activities
, не могут получить доступ к переменным, добавленным таким образом.
При выполнении средой выполнения действия MySequence
она вызывает его метод Execute, передавая ему контекст NativeActivityContext. Контекст NativeActivityContext выполняет для действия роль посредника по отношению к среде выполнения и применяется для разыменования аргументов и переменных, а также планирования работы других объектов Activity или делегата ActivityDelegates
. Для инкапсуляции логики планирования работы первого и всех последующих дочерних элементов в единственном методе в MySequence
используется метод InternalExecute
. Он начинает свое функционирование с разыменования currentIndex
. Если это значение равно количеству в коллекции Activities
, то последовательность завершается, действие выполняет возврат без планирования какой-либо работы и среда выполнения переводит его в состояние Closed. Если значение currentIndex
меньше количества действий, происходит получение следующего дочернего элемента из коллекции Activities
, а действие MySequence
вызывает метод ScheduleActivity с передачей ему подлежащего планированию дочернего элемента и CompletionCallback, который указывает на метод InternalExecute
. Наконец, значение currentIndex
увеличивается и управление снова передается среде выполнения. Пока экземпляр действия MySequence
имеет запланированный дочерний объект Activity, среда выполнения считает, что оно находится в состоянии выполнения.
После завершения дочернего действия выполняется CompletionCallback. Выполнение цикла продолжается с его верхней части. Как и метод Execute
, обратный вызов CompletionCallback принимает контекст ActivityExecutionContext, предоставляя средству реализации доступ к среде выполнения.
Действие MyWhile
отличается от действия MySequence
тем, что оно неоднократно планирует один объект Activity и в нем используется переменная типа Activity<bool> с именем Condition
для определения того, должно ли быть выполнено это планирование. Как и действие MySequence
, действие MyWhile
использует метод InternalExecute
для централизации своей логики планирования. Оно планирует значение Condition
типа Activity<bool> с помощью значения типа CompletionCallback<bool> с именем OnEvaluationCompleted
. После завершения выполнения проверки Condition
ее результат становится доступным через этот обратный вызов CompletionCallback в строго типизированном параметре с именем result
. Если значение равно true
, действие MyWhile
вызывает метод ScheduleActivity, передавая объект Body
Activity и метод InternalExecute
в качестве обратного вызова CompletionCallback. После завершения выполнения Body
проверка Condition
планируется еще раз в действии InternalExecute
, что приводит к очередному запуску цикла. Если проверка Condition
возвращает значение false, экземпляр действия MyWhile
передает управление среде выполнения без планирования Body
, а среда выполнения переводит действие в состояние Closed.
Настройка, построение и выполнение образца
Откройте образец решения Composite.sln в Visual Studio 2010.
Постройте и запустите решение.
Примечание |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\WF_WCF_Samples
Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.
<диск_установки>:\WF_WCF_Samples\WF\Basic\CustomActivities\Code-Bodied\CustomCompositeNativeActivity
|