[Develop]Lab19-LifecycleState

[Develop]Lab19-LifecycleState

Lab19、LifecycleState

淺談委派觀念。

在 WorkFlow Foundation 架構上我們會常常使用到委派的結構( delegate ),理由是因為工作流程本身與呼叫其程序是兩個獨立的個體。(
例如 : 以Windows Form 呼叫、ASP.Net 網頁呼叫…。

),所以工作流程本身與外部的互動就是一個很頻繁的動作,因此常常會有委派的需求與動作出現。我想這樣講還是太抽象,我們用生活上的一些例子先來幫助瞭解委派的觀念。假如

在現實生活中,你可能常常有這樣的經驗,請別人幫忙一件事;並且在完成的時候通知你。例如 : 這份公文可以幫我影印嗎? 那印好再通知我寄出去
! 此時有一個人開始進行影印的工作,

他就像一個工作流程 。而你將你的寄信工作( 也就是你的方法 )委派給他,也就是當他影印好公文的時候會通知你要執行寄信的動作 。也就是你的寄信工作是經由他的流程結束後觸發,

所以你將你的工作委派給他通知你執行。

工作流程生命週期。

當我們呼叫了一個工作流程,在執行的過程中,他不一定會很順利的執行直到完畢。過程中很可能會出現某些例外狀況,這些例外狀況也可以是由我們所預先設計。這個Lab我們要來

討論如何捕捉工作流程生命週期事件。首先我們參照下表,此為工作流程引發的事件與其回傳的事件引數。

[表 1] WorkflowInstanceEvents ( 資料參考: http://msdn.microsoft.com/zh-tw/library/aa663362.aspx
)


事件


說明


事件引數

WorkflowAborted

在工作流程執行個體中止時引發。

WorkflowEventArgs

WorkflowCompleted

在工作流程執行個體完成時引發。

WorkflowCompletedEventArgs

WorkflowCreated

在工作流程執行個體建構完成時,但在活動處理之前,也就是在工作流程開始執行之前引發。

WorkflowEventArgs

WorkflowIdled

工作流程執行個體進入閒置狀態時引發,也就是,在工作流程執行個體在等待外部事件
(例如,計時器、訊息等等) 以繼續執行時引發。

WorkflowEventArgs

WorkflowLoaded

在工作流程執行個體載入記憶體時引發,通常是從保存存放區載入。

WorkflowEventArgs

WorkflowPersisted

在工作流程執行個體保存時引發。

WorkflowEventArgs

WorkflowResumed

在工作流程執行個體重新繼續時引發,通常是從閒置或中止狀態繼續。

WorkflowEventArgs

WorkflowStarted

在工作流程執行個體開始執行時引發。

WorkflowEventArgs

WorkflowSuspended

在工作流程執行個體暫停時引發。

WorkflowSuspendedEventArgs

WorkflowTerminated

在工作流程執行個體終止時引發。

WorkflowTerminatedEventArgs

WorkflowUnloaded

在工作流程執行個體從記憶體卸載置入保存存放區時引發。

WorkflowEventArgs


新增一個新的WWF專案。

這個範例中我們要使用的是 [ 循序工作流程主控台應用程式 ] 。檔案名稱我們命名為 [ Lab19_LifecycleState ] 。

clip_image001


新增一個新的WWF專案。

我們在循序工作流程拉出下列 Activity 物件。 [ CodeActivity ] 、[ delayActivity ]、[ supendActivity
]、[ terminateActivity ]。後面三個 [ Activiry ] 都是由我們設計

來影響流程的元件。包括了停頓、暫停與終結這個流程。

clip_image002

點兩下 [ codeActivity ] 進入程式編輯介面裡。在這裡我們輸入右下圖的程式,來通知前端使用者 " 工作流程執行中
"。

clip_image003

clip_image004

點兩下 [ delayActivity ],在屬性視窗中我們設定 [ TimeoutDuration ] 屬性為 [ 00:00:03 ]。告訴工作流程到這裡時要停頓
3秒。

clip_image005

clip_image006

[ supendActivity ] 會讓工作流程運行到這邊的時候被暫停住,並且我們在屬性中的 [ Error ]區域輸入 [ 暫停工作流程
] ,這個訊息屬性可以被前端應用程式所取得。

clip_image007

clip_image008

接著我們設定一個[ terminateActivity ] 來終結這個流程 。在屬性訊息部份我們輸入 [ 終止工作流程 ]。

clip_image009

clip_image010


撰寫主控台程式。

我們切到 [ Program.cs ] 這支主控台程式中,這支程式是負責來啟動這個工作流程。我們也在這邊撰寫一些程式碼來擷取工作流程執行的狀態。參照下圖程式碼。

這邊就要運用一開始我們討論過的委派動作,我們將撰寫在主控台的"方法"委派給工作流程的"事件"。所以當事件發生時,便會連帶去觸發你委派給事件的方法(這段有點繞舌)。

我們用白話文來說,就是你委託媽媽在切好水果時通知你要來吃,這時媽媽切水果是一個工作流程;當媽媽切好水果的事件發生時,媽媽會呼叫你這個主控程式來吃….><。吃這個方法

因為是要吃到你的肚子裡的,所以這個方法你認為該寫在哪裡呢 ? 因該是寫在你身上而非你媽媽( 工作流程 )的身上吧。所以就是把你吃水果的這方法委派給媽媽切好水果的事件上。

這樣有比較聽得懂ㄇ ? 所以在主控台中,我們撰寫了幾個方法來被委派給工作流程的不同事件。當然也包括我們建立的 [延遲] 、 [暫停] 、[終結]

clip_image011


測試專案。

程式都撰寫完成後,我們按下 [ 啟動] 來建置並且執行這個專案。運氣好的話因該可以看到以下結果。

clip_image012