WF3 0和4 0區別介紹

2022-02-01 20:45:21 字數 4558 閱讀 8207

相對於之前的3.0、3.5中的workflow來說,4.0進行了很大的變動,包括流程設計工具、支援的活動的型別集合、工作流的內部的模型、執行引擎等等。對於其中的活動模型、執行引擎等內容,屬於比較理論而且深入的內容,我會在研究到一定程度之後與大家分享,希望通過本系列文章能夠和大家一起對wf3.0和4.0的區別和聯絡有個全面細緻深入的理解。

本文主要是對3.0和4.0之間的區別做了下簡單的介紹,熟悉或者精通wf的可以跳過。

既然3.0、3.5中的workflow和4.0不同,那麼我們首先來對比一下。首先從設計工具說起,分別用3.5(圖1)和4.0(圖2)建立乙個順序工作流,我們可以看到下面的流程設計介面:

圖1(3.5中的流程設計介面)

圖2(4.0中的流程設計介面)

從圖中我們不難看出區別,3.5中順序工作流初始化預設有個開始和結束節點,4.0預設則是一片空白。個人感覺這是一種觀念的改變,工作流始於開始、終於結束是我們傳統思維,然而開始結束本身就是乙個虛活動,更像是邊界的限定,開發人員了解,使用者卻不了解;4.0所給人的資訊更符合使用者思維,乙個流程始於活動而終於活動。基於設計出的流程,讓開發者、業務建模人員、使用者之間能夠相互交流,分析師能夠對流程進行優化,決策者能夠更好的決策是一種趨勢,而這種趨勢必然要跨出的一步就是流程設計的可被大眾理解化。

呵呵,有點扯遠了。我們接著看看3.5(圖3)和4.0(圖4)支援的活動型別:

圖3(3.5支援的活動型別)

圖4(4.0支援的活動型別)

可以看到4.0支援的活動型別不僅更多,而且分類更細緻。不僅在controlflow和原始型別中提供了基礎的活動,用來定製基本的流程,而且在flowchart裡面提供了能更加靈活的定製流程的活動型別,同時還提供用於訊息、事務、集合、錯誤處理等功能的活動。

在.net4.0中沒有狀態機工作流,但是可以功過flowchart來實現;4.0中沒有codeactivity,因為4.0是通過xaml來定義流程的,沒有額外的**檔案,如果需要這個功能可以自己實現,或者通過invokemethod來替代;同時對於錯誤的處理,4.0中增加了trycatch、throw、rethrow,而在3.0中錯誤處理活動的設定需要切換設計器的檢視,這樣在重新審閱流程的時候很容易被遺漏。

接下來看看引用的類庫以及專案檔案的目錄結構:

.net3.5中引用了以下類庫:

system.workflow.activities:定義了工作流可以建立、允許的活動集合

system.workflow.componentmodel:提供建立活動、工作流的基類、介面以及核心建模構造

system.workflow.runtime:提供一些類和介面可以控制工作流執行時引擎以及流程例項的執行

預設建立的工作流是workflow1.cs,對於設計完的流程是用類檔案的形式進行描述,即workflow1.designer.cs,執行**放到workflow1.cs中。

通過viewcode可以看到兩個類的**為:

public

sealed

partial

class

workflow1 : sequentialworkflowactivity }

partial

class

workflow1

#endregion

}.net4.0中workflow引用了以下類庫:

system.activities:包含建立和使用活動所需的所有類。使用此命名空間中的類可以定義活動、輸入輸出資料和變數

system.servicemodel:包含用於生成服務和客戶端應用程式所需的類、列舉和介面,這些類、列舉和介面可以用於生成大範圍的分布式程式

system.servicemodel.activities:使用此命名空間中的類可以從工作流接受訊息,或者向工作流傳送訊息,定義工作流服務的時候可以使用這些活動

預設建立的是workflow1.xaml,定義完的流程是用xml的方式進行描述。

通過viewcode,我們可以看到workflow1.xaml中的內容:

sap:virtualizedcontainerservice.hintsize="240,240"

mva:visualbasic.settings="assembly references and imported namespaces for internal implementation"

xmlns=""

xmlns:mc=""

xmlns:mv="clr-namespace:microsoft.visualbasic;assembly=system"

xmlns:mva="clr-namespace:microsoft.visualbasic.activities;assembly=system.activities"

xmlns:s="clr-namespace:system;assembly=mscorlib"

xmlns:s1="clr-namespace:system;assembly=system"

xmlns:s2="clr-namespace:system;assembly=system.xml"

xmlns:s3="clr-namespace:system;assembly=system.core"

xmlns:sad="clr-namespace:system.activities.debugger;assembly=system.activities"

xmlns:sap="/presentation"

xmlns:scg="clr-namespace:system.collections.generic;assembly=system"

xmlns:scg1="clr-namespace:system.collections.generic;assembly=system.servicemodel"

xmlns:scg2="clr-namespace:system.collections.generic;assembly=system.core"

xmlns:scg3="clr-namespace:system.collections.generic;assembly=mscorlib"

xmlns:sd="clr-namespace:system.data;assembly=system.data"

xmlns:sl="clr-namespace:system.linq;assembly=system.core"

xmlns:st="clr-namespace:system.text;assembly=mscorlib"

xmlns:x=""/>

可以看到,對於類檔案、命名空間的引用,xml使用的schema限定等都在workflow1.xaml中進行了描述。

.net3.5中program.cs中**如下

class

program

; workflowruntime.workflowterminated += delegate(object sender, workflowterminatedeventargs e)

; workflowinstance instance = workflowruntime.createworkflow(typeof(wfsequencetest.workflow1));

instance.start();

waithandle.waitone();

} }

} **中對流程例項完成、流程例項終止進行了事件的處理,然後通過使用者定義的workflow1建立workflowinstance,呼叫instance.start()開始執行流程。

.net4.0中program.cs**如下

class

program }

**中建立了乙個workflow1的例項,然後通過workflowinvoker.invoke來開始執行流程。

通過對比不難發現,4.0的流程建立執行更簡潔,也更符合思維習慣。以請假流程為例,請假人首先會填寫個請假條,然後報領導審批就是;用工作流來描述這個過程就是,首先定義個請假流程,包括請假發起環節和請假審批環節,流程定義好之後,誰想請假了,填寫請假表單,提交到領導審批環節即可;如果用程式來描述那就是設計乙個請假流程(類、xaml等),建立例項並執行。我們很有可能會忘記一些事件的定製,然而有些情況下這往往會導致流程出現一些問題,例如3.5中我們需要定製兩個事件,建立並開始流程例項的**也比較繁瑣。

總起來說4.0更靈活,更全面,更符合發展趨勢。

程序和執行緒的區別介紹

1 首先是定義 程序 是執行中一段程式,即一旦程式被載入到記憶體中並準備執行,它就是乙個程序。程序是表示資源分配的的基本概念,又是排程執行的基本單位,是系統中的併發執行的單位。執行緒 單個程序中執行中每個任務就是乙個執行緒。執行緒是程序中執行運算的最小單位。2 乙個執行緒只能屬於乙個程序,但是乙個程...

程序和執行緒的區別介紹

1 首先是定義 程序 是執行中一段程式,即一旦程式被載入到記憶體中並準備執行,它就是乙個程序。程序是表示資源分配的的基本概念,又是排程執行的基本單位,是系統中的併發執行的單位。執行緒 單個程序中執行中每個任務就是乙個執行緒。執行緒是程序中執行運算的最小單位。2 乙個執行緒只能屬於乙個程序,但是乙個程...

attr 和 prop 的區別介紹

對於 html 元素本身就帶有的固有屬性,在處理時,使用prop方法。對於 html 元素我們自己自定義的 dom 屬性,在處理時,使用attr方法。例項 1 這個例子裡 元素的 dom 屬性有 href target和class,這些屬性就是 元素本身就帶有的屬性,也是 w3c 標準裡就包含有這幾...