WF Workflow 狀態機工作流 開發

2022-02-05 09:46:16 字數 3406 閱讀 7662

概述

工作流是對業務流程的建模,當我們設計工作流的時候,我們首先要分析業務處理過程中要經歷的步驟。然後,我們就可以利用wf建立工作流模型來模擬業務的處理過程。

我們知道,wf包含兩種型別的工作流:順序工作流和狀態機工作流。順序工作流提供了一系列有組織的步驟,一般情況下,步驟是逐一執行的。可能有的步驟需要等待某些事件的發生才可以繼續執行,但通常情況下順序工作流一般用於無需人工干預的操作。

狀態機工作流提供了一系列的狀態。工作流從初始狀態開始,到終止狀態結束。兩個狀態之間定義行為進行過渡。通常情況下,狀態機工作流對事件作出反應,事件的發生將會使狀態發生改變。

現在來看wf 狀態設計圖

new workflow的序例圖如下

wf workflow 傳值方式

public sealed partial class ctdiagnosis : statemachineworkflowactivity

set

}public ctdiagnosis()

private void handlemanagersendbackevent_invoked(object sender, externaldataeventargs e)

}

獲取workflow處理器

/// /// 獲取workflow處理器

///

public static workflowruntime currentworkflowruntime

return workflowruntime;}}

runtime 服務workflowruntime類僅僅提供了執行工作流的基本功能,之前我們提到的一些重要功能(比如跟蹤工作流)則可以通過workflowruntime提供的擴充套件性機制-addservice方法來實現.

addservice允許我們向runtime中新增可用的服務.這些服務可以是我們為特定領域編寫的自定義服務,也可以是wf中內建的服務.

排程服務 scheduling services

排程服務用來控制runtime執行工作流所需要的執行緒.

defaultworkflowschedulerservice會建立新的執行緒來執行工作流.因為工作流和宿主應用程式的執行緒是分開的,所以工作流是非同步執行的並且不會阻止任何應用程式的執行緒.我們還可以配置允許同時執行的工作流最大數量.

當宿主應用程式可以轉讓執行緒給工作流runtime時可以使用另外乙個排程服務-manualworkflowschedulerservice.對伺服器端應用程式(比如asp.net web應用程式和web service)而言,把執行緒轉讓給runtime非常有用.伺服器端應用程式通常的做法是為每個客戶端請求的服務建立執行緒.而宿主應用程式把執行緒」借給」wf runtime的意義在於可以讓runtime在每個請求的執行緒上同步地執行工作流,而不是為每個請求建立兩個執行緒.

和windows worklow的所有服務一樣,如果內建的服務不能滿足你的需求,你可以定義你自己的排程服務.

事務服務 transaction services

事務服務允許runtime保持位於工作流內部和持久儲存器(durable store)中的狀態的一致性.預設的事務服務是defaultworkflowtransactionservice類的例項.正在執行的工作流程序中的活動和此服務共享相同的程序和相同的事務上下文.

wf依靠.net中的system.transactions命名空間來實現事務機制. transactions類提供乙個輕量級的, auto-enlisting並且可提公升的事務.事務像本地事務一樣啟動,然後runtime可以根據需要把它提公升為重量級的分布式事務.

持久化服務 persistence services

sqlworkflowpersistenceservice支援sql server 2000以及更高版本(還包括免費的msde和express版).當然,我們還需要乙個資料庫架構來讓持久化服務知道如何去儲存工作流狀態,這部分內容將在後面的章節詳述.

跟蹤服務 tracking services

當排程服務選擇了工作流執行的執行緒之後,跟蹤服務就會負責監視並記錄工作流的執行資訊.跟蹤服務使用tracking profile來通知runtime它需要的工作流資訊的型別.跟蹤服務還可以開啟跟蹤頻道(tracking channel)來接收事件和資料.wf包含乙個sqltrackingservice類,這個類可以將跟蹤資料儲存到sql server資料庫.跟蹤服務將使用事務服務來確保工作流的跟蹤資料與被跟蹤工作流的狀態一致.預設runtime不會啟動跟蹤服務,但我們可以用程式設計的方式新增跟蹤服務(或使用應用程式配置檔案配置跟蹤服務).

獲取workflow的模板

/// /// 獲取workflow的模板

///

///

///

private type getworkflowtype(string workflowname)

獲取workflow 的例項id

/// /// 獲取workflow 的例項id

///

///

///

///

public guid newworkflow(string workflowname, object startparameter)

獲取workflow的狀態

/// /// 獲取workflow的狀態

///

///

///

public string getinstancestatebyinstanceid(guid instanceid)

總結狀態機工作流的持久化很重要,要不workflow重啟時,得不到正確的狀態.

參考文獻

《wf程式設計》系列之4 - 漫遊工作流:widows workflow runtime及其服務

歡迎各位參與討論,如果覺得對你有幫助,

推薦下,萬分謝謝.

出處:

狀態機工作流

狀態機工作流通常用於模擬不能被 人類行為時的事件流的一種替代方案,例如,在乙個審批流程中,當事件驅動流程執行的過程,通常作為外部事件和導向轉換,通常作為外部事件和引導其他可能的狀態之間的轉換。狀態機工作流的必須包括initial狀態和 final 狀態,用以表示該程序的啟動和完成狀態。這是乙個靈活的...

宿主中操作狀態機工作流的狀態

從引擎中得到狀態機例項 建構函式 dim狀態機例項 as statemachineworkflowinstance 狀態機例項 new statemachineworkflowinstance me.引擎,me.當前操作的例項.instanceid 得到工作流的狀態列表 states 集合 下拉列表...

關於狀態機工作流的程式設計方法

還沒想好怎麼寫,先起了個古怪的名字。好吧,這篇文章純屬拔草之作,只講一種大概的解決方案。不過,我們大概得先解決掉兩個概念 乙個是狀態機,乙個是工作流。什麼是狀態機?大概來說,就是我這裡有一堆的狀態,我在進行一項工作的時候,有一系列的狀態 我要從乙個狀態轉移到另乙個狀態。舉個最簡單的栗子 比如乙個燈泡...