一、簡介
使用InvokeWorkflowActivity 活動可以從一個工作流中異步方式啟動另一個工作流。 在已啟動的工作流開始執行且工作流分支中的下一個活動執行之前,InvokeWorkflowActivity 活動即告完成。
注意:
* WF不支持遞歸工作流。如果工作流A能夠啟動工作流B,則工作流B既不能直接啟動工作流A,也不能啟動任何直接或間接調用工作流A的工作流。
* InvokeWorkflowActivity活動要求工作流運行時使用當前附加到該運行時的計劃程序服務創建新工作流。
* 所調用的工作流將只能夠接收輸入參數。不支持在工作流完成之後獲取輸出參數,因為該活動以異步方式調用工作流。
* 工作流之間的標准通信規則適用於與InvokeWorkflowActivny活動所創建的新工作流實例進行通信。
使用InvokeWorkflowActivity活動的步驟如下:
* 拖動一個InvokeWorkflowActivity到工作流中希望的位置處。
* 設置TargetWorkflow屬性為希望執行的工作流的類型(Type)。
* 為TargetWorkflow設置所需要的值。
當設置TargetWorkflow屬性時,該活動提供了對話框允許從所有引用到的活動類型列表中導航到正確的類型,但是只有派生自Activity的類會被顯示在列表中。為了引用一個新的工作流類型,必須首先添加到包含工作流的項目或程序集的引用。具體對話框請參考本文後面的圖示。
一旦定義了TargetWorkflow屬性,工作流的參數集合屬性將使用定義在TargetWorkflow中的其他任何屬性所更新。允許開發人員在屬性窗口中為任何所需的屬性設置值,可以設置靜態值或者是綁定屬性到當前工作流的其他屬性或者是其他活動的其他屬性。
InvokeWorkflowActivity提供了一個Invoking事件允許開發人員使用代碼處理。該事件在創建一個新的工作流之前觸發,這使開發人員在開始一個新的工作流之前能夠有機會完成一些設置任務。
關於InvokeWorkflowActiv時的一個重要方面工作流將以異步的方式執行,因此不會等待新工作流的執行完成。因為執行過程是異步的,所以無法獲取另一個工作流的輸出參數。通常需要和宿主建立額外的通信機制來獲取其輸出。
二、創建控制台順序工作流示例程序框架
說明:本文創建的InvokeWorkflowActivityDemo示例演示了如何在一個狀態機工作流內部調用另外的一個工作 SubWorkflow,並且定義了本地服務接口實現,使用HandleExternalEvent活動調用外部事件以等待被調用的工作流實例執行完成。該活動需要等待一個事件的觸發才能夠繼續工作流的運行,而在Program.cs中,設置了只有當指定非宿主工作流執行完畢後,才觸發事件。因此這實現了一種等待被調用工作流執行完成才繼續執行的效果。
重要提示:
本實例的學習基於WWF中的許多新概念(不包括在以前的教程中),請結合後面的參考資料全面理解。個別難點,請不必過於擔心,我會在後面的系列文章中作細致的剖析。
請遵循如下步驟創建一個控制台狀態機工作流示例程序:
1.啟動VS2008,單擊菜單”文件“|”新建“|”項目“,創建一個名字為InvokeWorkflowActivityDemo的控制台狀態機工作流示例程序。
2.之後,系統自動打開工作流設計器界面。
3.從工具箱中拖動四個State活動到工作流設計器中。然後,再依次把兩個StateInitialization活動分別拖動到前兩個State活動中,再拖動一個EventDrivenActivity活動到第三個State活動中。最後,再使用拖動手柄的方法創建四個State活動的轉換關系,得到如圖所示的情形。