共用方式為


使用 Native 活動的自訂複合

CustomCompositeNativeActivity sample 示範如何撰寫 NativeActivity,為其他 Activity 物件排程,以控制工作流程的執行流程。 此範例使用兩個常用的控制流程 (Sequence 和 While),以示範如何進行這項處理。

範例詳細資料

MySequence 開始,要注意的第一件事就是它會衍生自 NativeActivityNativeActivityActivity 物件,可透過傳遞給 NativeActivityContext 方法的 Execute 來公開工作流程執行階段的完整範圍。

MySequence 會公開 Activity 物件的公用集合,這些物件是由工作流程作者所填入。 在執行工作流程之前,工作流程執行階段會在工作流程中的每一個活動上呼叫 CacheMetadata 方法。 在這個程序期間,執行階段會建立父-子關係來設定資料範圍及進行存留期管理。 CacheMetadata 方法的預設實作會將 TypeDescriptor 執行個體類別用於 MySequence 活動,以將類型 ActivityIEnumerable<Activity> 的任何公用屬性新增為 MySequence 活動的子系。

每當活動公開子活動的公開集合時,這些子活動很可能會共用狀態。 最佳作法是讓父活動 (此案例中的 MySequence) 也公開變數集合,子活動就可以透過這些變數完成這項作業。 就像子活動一樣,CacheMetadata 方法會將類型 VariableIEnumerable<Variable> 的公用屬性新增為與 MySequence 活動相關聯的變數。

除了公用變數 (由 MySequence 的子系所操作) 以外,MySequence 在執行其子系的過程中也必須追蹤其所在位置。 它會使用私用變數 currentIndex 完成這項處理。 這個變數會註冊為 MySequence 環境的一部分,方式是在 MySequence 活動的 CacheMetadata 方法內新增 AddImplementationVariable 方法的呼叫。 加入至 ActivityMySequence 集合的 Activities 物件不能存取以這個方式加入的變數。

當執行階段執行 MySequence 時,執行階段會呼叫它的 Execute 方法,傳入 NativeActivityContextNativeActivityContext 是回到執行階段的活動 Proxy,可對引數和變數取值,以及排程其他 Activity 物件或 ActivityDelegatesMySequence 會使用 InternalExecute 方法,將排程第一個子系和所有後續子系的邏輯封裝在單一方法中。 它一開始會先針對 currentIndex 來取值。 如果它等於 Activities 集合中的計數,則會完成序列、活動會傳回而不排程任何工作,然後執行階段會將它移到 Closed 狀態。 如果 currentIndex 小於活動計數,則下一個子系會取自 Activities 集合,而 MySequence 會呼叫 ScheduleActivity,傳入要排程的子系和指向 InternalExecute 方法的 CompletionCallback。 最後,currentIndex 會遞增,而控制權會回到執行階段。 只要 MySequence 執行個體已排程子物件 Activity,執行階段就會將它視為「正在執行」狀態。

當子活動完成時,就會執行 CompletionCallback。 迴圈會從最上層繼續執行。 就像 Execute 一樣,CompletionCallback 會採用 NativeActivityContext,讓實作者可存取執行階段。

MyWhileMySequence 相異之處在於,前者會重複排程單一 Activity 物件,而且會使用名為 ConditionActivity<TResult><bool> 來判斷這個排程是否應該發生。 就像 MySequence 一樣,MyWhile 會使用 InternalExecute 方法來集中處理它的排程邏輯。 其使用名為 OnEvaluationCompletedCompletionCallback<TResult><bool> 來排程 ConditionActivity<bool>。 當 Condition 執行完成時,結果會透過此 CompletionCallback,以名為 result 的強型別參數提供。 如果為 true,則 MyWhile 會呼叫 ScheduleActivity,傳入 BodyActivity 物件和 InternalExecute 當做 CompletionCallback。 當完成 Body 的執行時,Condition 會再次於 InternalExecute 中排程,重新開始迴圈。 當 Condition 傳回 false 時,MyWhile 的執行個體會將控制權送回執行階段而不排程 Body,而執行階段會將它移到 Closed 狀態。

若要安裝、建置及執行範例

  1. 在 Visual Studio 中開啟 Composite.sln 範例解決方案。

  2. 建置並執行方案。