相比於WF 3.5,WF 4.0 beta1提供了大量開箱即用的活動,我們可以使用這些活動來創作工作流或者創建自定義活動。本文將會對這些活動做一個簡單快速的概覽,並介紹它們的關鍵特性。
活動是工作流程序的工作單元。在WF 4.0中,活動由簽名和正文組成。簽名是活動的公共參數的術語化定義,這些公共參數定義了活動的輸入和輸出數據流。而正文則是指活動的執行邏輯,此邏輯可以用其他活動聲明性地表示,也可以通過代碼來表示。
下面按照WF 4.0 beta1在Visual Studio 2010工具欄中的分類來簡單地介紹一下這些內置活動。
Procedural
程序性活動提供了一種模擬順序流控制的機制,我們已經在使用標准編程語言(比如C#、VB)的過程中對這種流控制非常熟悉了。程序性活動包含了可以用來表示順序行為的基本構造塊,覆蓋的方面包括流控制、對CLR對象的方法調用、集合維護以及錯誤處理。它還涉及了一些高端場景,比如並行活動、事務管理、補償、取消以及持久性。下表包含了Procedural分類中的所有活動。描述中的粗體字表示最重要的參數。
活動
描述
設計器外觀
集合管理
AddToCollection<T>
向Collection中添加 Item。
RemoveFromCollection<T>
將Item 從Collection中移除。
ClearCollection<T>
清空Collection,將其中存儲的所有子項都移除。
ExistsInCollection
驗證中Collection是否存在Item 。如果子項存在,活動的Result 參數就會被賦值為True。
流控制
If
If活動會根據一個Boolean類型的表達式來執行一個子活動。
如果Boolean 表達式-Condition 計算為 True (並且配置了Then活動),就會計劃執行Then”活動。如果表達式計算為False(並且設置了Else活動),就會計算Else活動。
DoWhile
重復執行其 Body 直到 Condition 計算為 True。Body至少會執行一次。
ForEach / ForEach<T>
ForEach活動包含一個Values 列表以及一個Body。在運行時,該列表會進行被循環,並且Body會為列表中的每一個值都執行一次。
Pick
Pick活動在WF中提供了基於事件的流控制模型。 Pick唯一有效的子活動是PickBranches。
在Pick開始執行時,其Branches 的所有Trigger活動都會被計劃執行。當第一個Trigger完成了其計劃執行的相應Action活動之後,所有其他Trigger活動就都會被取消。
PickBranch
PickBranch表示Pick活動的一個分支。它由Trigger 和Action組成。PickBranch 只能被添加到Pick活動中。
Sequence
Sequence活動允許一個或多個 Activities按照順序執行。
Switch<T>
Switch活動和c#的switch 語句很像。它包含一個Expression 和一組Cases (每個case都有一個鍵和一個活動)。當表達式計算完後,Switch活動就會查找匹配表達式結果的 Case,如果找到,就執行與該Case相關聯的活動。
While
當Boolean類型Condition 的計算為True時,While 活動就執行其 Body。
並行執行
Parallel
Parallel活動允許它的子活動並行執行。它會在開始執行時計劃其Branches 集合中的每一個WorkflowElement的執行。當所有Branches都完成或其CompletionCondition 屬性計算為True時,它就會完成執行。
ParallelForEach / ParallelForEach<T>
ParallelForEach 活動會遍歷其Values集合並為該集合中的每一個元素都執行一個 Activity,它的執行方式和ForEach很像。主要的區別是嵌入的語句是以並行模式執行的。
就像Parallel活動那樣,ParallelForEach也有一個 CompletionCondition,所以 ParallelForEach 活動可以提前完成,條件是CompletionCondition返回True。 CompletionCondition會在每次迭代完成後進行計算。
錯誤處理
TryCatch
TryCatch 活動類似於c#中的try..catch 結構:所有位於Try塊中的的活動都會被執行,如果發生了異常,就會計劃執行最為匹配的Catch 塊(如果沒有發現匹配的Catch,工作流就會被中斷)。所有Catch塊都位於一個名為Catches的集合中。
TryCatch活動還有一個Finally 塊,它會在Try(以及可能執行的Catch)之後執行。
關於未被處理的異常的提示:
TryCatch 提供了工作流級別的異常處理機制。當拋出未被處理的異常時,工作流就會被中斷,因此Finally塊也就不會被執行。此行為也和c#中的Try..Catch結構保持一致。
Catch<T>
表示用於 TryCatch活動中的一個Catch。如果Try元素中拋出了一個異常,TryCatch就會嘗試根據拋出異常的類型來尋找一個與之匹配的 Catch 元素。
Catch<T>只能用於TryCatch活動中。
Throw
Throw 活動會在工作流中拋出一個異常。Throw 活動包含一個Exception 屬性,該屬性包含了將會在執行時拋出的異常。
實用工具
Assign
Assign活動會將其Value 參數的值賦值給其To 參數。
這兩個參數的類型必須是兼容的。這種兼容性會在運行期間進行驗證。
Delay
Delay活動,顧名思義,會將當前工作流的執行阻止一段時間,這段時間是由用戶通過其Duration參數指定的。延時過期後,工作流就會繼續執行。Delay的延時應該被設置為一個TimeSpan值。
InvokeMethod / InvokeMethod<T>
InvokeMethod 是一個允許我們調用一個現有的CLR方法和靜態方法的活動。想要調用一個方法,我們所需要做的就是提供方法的所有者信息(靜態方法為TargetType ,實例方法為TargetObject )、 MethodName以及該方法的Parameters。
InvokeMethod支持下面幾種方法調用場景:
公共的實例方法和靜態方法
通過值或引用傳遞的參數
對參數數組的支持
對泛型參數的支持
異步方法調用
WriteLine
將文本輸出到配置好的輸出控制台中。
輸出到System.Console的背後:
WriteLine 有一個TextWriter 參數,它可以配置為不同的輸出。例如,我們可以將TextWriter屬性配置為發送文本到ASP.NET 頁面。如果沒有設置TextWriter ,就會選用其默認值-System Console。
高級(取消、補償、事務以及持久性)
CancellationScope
CancellationScope 活動包含兩個主要部分,Body 和 CancelHandler。Body包括正常執行的活動。如果活動被取消,就會執行CancelHandler。
CompensatableActivity
CompensableActivity用來定義一個可能長期運行的活動,同時還會伴隨著 Compensation 和 Confirmation 邏輯。
Compensation 允許用戶指定執行糾正操作的活動,該活動將會在Body 成功完成之後執行。
Compensate
Compensate用來顯式地調用CompensableActivity的補償處理程序。
Confirm
Confirm用來顯式地調用CompensableActivity的確認處理程序。
Persist
持久化工作流實例。會根據執行中的WorkflowInstancethe (此活動不包含任何參數)的配置來完成工作流的持久性。
TransactionScopeActivity
TransactionScopeActivity 提供了初始化新事務、構建事務處理環境(一個工作流執行屬性)以及在TransactionScope活動的Body 完成之後調用事務的完成操作。
TransactionScopeActivity 支持“要求”語義。如果已經有一個環境事務在使用中,否則就創建一個新的事務。
嵌套的事務范圍
TransactionScopeActivity 可以嵌套於另一個TransactionScopeActivity中。一個嵌套於另一個TransactionScopeActivity 中的TransactionScopeActivity 將會使用現有的事務。
本文到此暫時告一段落,下一篇文章我們接著來概覽WF 4.0 beta1提供的其他幾類活動:Flowchart、Messaging、PowerShell和Migration。
本文翻譯自:http://blogs.msdn.com/endpoint/archive/2009/05/29/a-tour-on-the-wf4-activity-palette.aspx