Поделиться через


Пользовательское составное действие, использующее собственное действие

Данный раздел относится к версии 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.

Настройка, построение и выполнение образца

  1. Откройте образец решения Composite.sln в Visual Studio 2010.

  2. Постройте и запустите решение.

Dd759031.Important(ru-ru,VS.100).gif Примечание
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).

<диск_установки>:\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