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

В примере CustomCompositeNativeActivity показано, как написать NativeActivity объект, который планирует другие Activity объекты для управления потоком выполнения рабочего процесса. В этом образце используются два общих потока управления, Sequence и While, для демонстрации того, как это сделать.

Подробные сведения об образце

Прежде всего об объекте MySequence следует отметить, что он является производным от NativeActivity. NativeActivity - объект Activity, который предоставляет доступ ко всем возможностям среды выполнения рабочего процесса с помощью объекта NativeActivityContext, передаваемого методу Execute.

Действие MySequence предоставляет доступ к общедоступной коллекции объектов Activity, которая заполняется разработчиком рабочего процесса. Перед выполнением рабочего процесса среда выполнения рабочего процесса вызывает метод CacheMetadata для каждого действия в рабочем процессе. В ходе этого процесса среда выполнения определяет связи типа «родитель-потомок» в целях управления областью определения данных и временем существования. Реализация метода по умолчанию использует класс экземпляра CacheMetadata для действия, MySequence чтобы добавить любое общедоступное свойство типа Activity или><IEnumerableActivity в качестве дочерних элементов MySequence действия.TypeDescriptor

Каждый раз, когда действие предоставляет доступ к общедоступной коллекции дочерних действий, возникает вероятность того, что эти дочерние действия будут приобретать одинаковое состояние. Рекомендуется, чтобы родительское действие, в данном случае MySequence, также предоставляло доступ к коллекции переменных, с помощью которых дочерние действия могли бы это осуществить. Как и дочерние действия, метод добавляет общедоступные свойства типа Variable или IEnumerableVariable<> переменные, CacheMetadata связанные с действием.MySequence

Помимо общедоступных переменных, которыми управляют действия, дочерние по отношению к MySequence, действие MySequence должно также следить, где оно находится с точки зрения выполнения его дочерних действий. Для этого в нем используется закрытая переменная currentIndex. Эта переменная регистрируется в составе MySequence среды путем добавления вызова AddImplementationVariable метода в метод действия MySequenceCacheMetadata . Объекты Activity, добавленные в коллекцию MySequenceActivities, не могут получить доступ к переменным, добавленным таким образом.

При выполнении средой выполнения действия MySequence она вызывает его метод Execute, передавая ему контекст NativeActivityContext. Это NativeActivityContext прокси-сервер действия обратно в среду выполнения для разыменовки аргументов и переменных, а также планирования других Activity объектов или ActivityDelegates. MySequence использует метод InternalExecute для инкапсуляции логики планирования работы первого дочернего элемента и всех последующих дочерних элементов в единственном методе. Он начинает свое функционирование с разыменования currentIndex. Если это значение равно количеству в коллекции Activities, то последовательность завершается, действие выполняет возврат без планирования какой-либо работы и среда выполнения переводит его в состояние Closed. Если значение currentIndex меньше количества действий, следующий дочерний элемент получается из Activities коллекции и MySequence вызовов ScheduleActivity, передавая дочерний объект, который должен быть запланирован, и CompletionCallback то, что указывает на InternalExecute метод. Наконец, значение currentIndex увеличивается и управление снова передается среде выполнения. Пока экземпляр действия MySequence имеет запланированный дочерний объект Activity, среда выполнения считает, что оно находится в состоянии выполнения.

После завершения дочернего действия выполняется CompletionCallback. Выполнение цикла продолжается с его верхней части. Как и метод Execute, обратный вызов CompletionCallback принимает контекст NativeActivityContext, предоставляя средству реализации доступ к среде выполнения.

MyWhile отличается от MySequence того, что он планирует один Activity объект многократно, и в том, что он использует Activity<TResult><логическое> имя Condition , чтобы определить, должно ли происходить это планирование. Как и действие MySequence, действие MyWhile использует метод InternalExecute для централизации своей логики планирования. Он планирует ConditionActivity<логическое значение> с логическим<CompletionCallback<TResult>> именем.OnEvaluationCompleted После завершения выполнения Condition его результат становится доступным через это CompletionCallback в строго типизированном параметре с именем result. Если значение равно true, действие MyWhile вызывает метод ScheduleActivity, передавая объект Body типа Activity и метод InternalExecute в качестве обратного вызова CompletionCallback. После завершения выполнения Body проверка Condition планируется еще раз в действии InternalExecute, что приводит к очередному запуску цикла. Если проверка Condition возвращает значение false, экземпляр действия MyWhile передает управление среде выполнения без планирования Body, а среда выполнения переводит действие в состояние Closed.

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

  1. Откройте пример решения Composite.sln в Visual Studio.

  2. Выполните сборку и запуск решения.