使用 Native 活動的自訂複合
CustomCompositeNativeActivity sample 示範如何撰寫 NativeActivity,為其他 Activity 物件排程,以控制工作流程的執行流程。 此範例使用兩個常用的控制流程 (Sequence 和 While),以示範如何進行這項處理。
範例詳細資料
從 MySequence
開始,要注意的第一件事就是它會衍生自 NativeActivity。 NativeActivity 是 Activity 物件,可透過傳遞給 NativeActivityContext 方法的 Execute
來公開工作流程執行階段的完整範圍。
MySequence
會公開 Activity 物件的公用集合,這些物件是由工作流程作者所填入。 在執行工作流程之前,工作流程執行階段會在工作流程中的每一個活動上呼叫 CacheMetadata 方法。 在這個程序期間,執行階段會建立父-子關係來設定資料範圍及進行存留期管理。 CacheMetadata 方法的預設實作會將 TypeDescriptor 執行個體類別用於 MySequence
活動,以將類型 Activity 或 IEnumerable<Activity> 的任何公用屬性新增為 MySequence
活動的子系。
每當活動公開子活動的公開集合時,這些子活動很可能會共用狀態。 最佳作法是讓父活動 (此案例中的 MySequence
) 也公開變數集合,子活動就可以透過這些變數完成這項作業。 就像子活動一樣,CacheMetadata 方法會將類型 Variable 或 IEnumerable<Variable> 的公用屬性新增為與 MySequence
活動相關聯的變數。
除了公用變數 (由 MySequence
的子系所操作) 以外,MySequence
在執行其子系的過程中也必須追蹤其所在位置。 它會使用私用變數 currentIndex
完成這項處理。 這個變數會註冊為 MySequence
環境的一部分,方式是在 MySequence
活動的 CacheMetadata 方法內新增 AddImplementationVariable 方法的呼叫。 加入至 Activity MySequence
集合的 Activities
物件不能存取以這個方式加入的變數。
當執行階段執行 MySequence
時,執行階段會呼叫它的 Execute 方法,傳入 NativeActivityContext。 NativeActivityContext 是回到執行階段的活動 Proxy,可對引數和變數取值,以及排程其他 Activity 物件或 ActivityDelegates
。 MySequence
會使用 InternalExecute
方法,將排程第一個子系和所有後續子系的邏輯封裝在單一方法中。 它一開始會先針對 currentIndex
來取值。 如果它等於 Activities
集合中的計數,則會完成序列、活動會傳回而不排程任何工作,然後執行階段會將它移到 Closed 狀態。 如果 currentIndex
小於活動計數,則下一個子系會取自 Activities
集合,而 MySequence
會呼叫 ScheduleActivity,傳入要排程的子系和指向 InternalExecute
方法的 CompletionCallback。 最後,currentIndex
會遞增,而控制權會回到執行階段。 只要 MySequence
執行個體已排程子物件 Activity,執行階段就會將它視為「正在執行」狀態。
當子活動完成時,就會執行 CompletionCallback。 迴圈會從最上層繼續執行。 就像 Execute
一樣,CompletionCallback 會採用 NativeActivityContext,讓實作者可存取執行階段。
MyWhile
與 MySequence
相異之處在於,前者會重複排程單一 Activity 物件,而且會使用名為 Condition
的 Activity<TResult><bool> 來判斷這個排程是否應該發生。 就像 MySequence
一樣,MyWhile
會使用 InternalExecute
方法來集中處理它的排程邏輯。 其使用名為 OnEvaluationCompleted
的 CompletionCallback<TResult><bool> 來排程 Condition
Activity<bool>。 當 Condition
執行完成時,結果會透過此 CompletionCallback,以名為 result
的強型別參數提供。 如果為 true
,則 MyWhile
會呼叫 ScheduleActivity,傳入 Body
Activity 物件和 InternalExecute
當做 CompletionCallback。 當完成 Body
的執行時,Condition
會再次於 InternalExecute
中排程,重新開始迴圈。 當 Condition
傳回 false
時,MyWhile
的執行個體會將控制權送回執行階段而不排程 Body
,而執行階段會將它移到 Closed 狀態。
若要安裝、建置及執行範例
在 Visual Studio 中開啟 Composite.sln 範例解決方案。
建置並執行方案。