Пользовательское составное действие, использующее собственное действие
В примере 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 метода в метод действия MySequence
CacheMetadata . Объекты, 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 принимает контекст NativeActivityContext, предоставляя средству реализации доступ к среде выполнения.
MyWhile
отличается от MySequence
того, что он планирует один Activity объект многократно, и в том, что он использует Activity<TResult><логическое> имя Condition
, чтобы определить, должно ли происходить это планирование. Как и действие MySequence
, действие MyWhile
использует метод InternalExecute
для централизации своей логики планирования. Он планирует Condition
Activity<логическое значение> с логическим<CompletionCallback<TResult>> именем.OnEvaluationCompleted
После завершения выполнения Condition
его результат становится доступным через это CompletionCallback в строго типизированном параметре с именем result
. Если значение равно true
, действие MyWhile
вызывает метод ScheduleActivity, передавая объект Body
типа Activity и метод InternalExecute
в качестве обратного вызова CompletionCallback. После завершения выполнения Body
проверка Condition
планируется еще раз в действии InternalExecute
, что приводит к очередному запуску цикла. Если проверка Condition
возвращает значение false
, экземпляр действия MyWhile
передает управление среде выполнения без планирования Body
, а среда выполнения переводит действие в состояние Closed.
Настройка, сборка и выполнение образца
Откройте пример решения Composite.sln в Visual Studio.
Выполните сборку и запуск решения.