淺談委派觀念。 在 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 ] 。 新增一個新的WWF專案。 我們在循序工作流程拉出下列 Activity 物件。 [ CodeActivity ] 、[ delayActivity ]、[ supendActivity ]、[ terminateActivity ]。後面三個 [ Activiry ] 都是由我們設計 來影響流程的元件。包括了停頓、暫停與終結這個流程。 點兩下 [ codeActivity ] 進入程式編輯介面裡。在這裡我們輸入右下圖的程式,來通知前端使用者 " 工作流程執行中 "。 點兩下 [ delayActivity ],在屬性視窗中我們設定 [ TimeoutDuration ] 屬性為 [ 00:00:03 ]。告訴工作流程到這裡時要停頓 3秒。 [ supendActivity ] 會讓工作流程運行到這邊的時候被暫停住,並且我們在屬性中的 [ Error ]區域輸入 [ 暫停工作流程 ] ,這個訊息屬性可以被前端應用程式所取得。 接著我們設定一個[ terminateActivity ] 來終結這個流程 。在屬性訊息部份我們輸入 [ 終止工作流程 ]。 撰寫主控台程式。 我們切到 [ Program.cs ] 這支主控台程式中,這支程式是負責來啟動這個工作流程。我們也在這邊撰寫一些程式碼來擷取工作流程執行的狀態。參照下圖程式碼。 這邊就要運用一開始我們討論過的委派動作,我們將撰寫在主控台的"方法"委派給工作流程的"事件"。所以當事件發生時,便會連帶去觸發你委派給事件的方法(這段有點繞舌)。 我們用白話文來說,就是你委託媽媽在切好水果時通知你要來吃,這時媽媽切水果是一個工作流程;當媽媽切好水果的事件發生時,媽媽會呼叫你這個主控程式來吃….><。吃這個方法 因為是要吃到你的肚子裡的,所以這個方法你認為該寫在哪裡呢 ? 因該是寫在你身上而非你媽媽( 工作流程 )的身上吧。所以就是把你吃水果的這方法委派給媽媽切好水果的事件上。 這樣有比較聽得懂ㄇ ? 所以在主控台中,我們撰寫了幾個方法來被委派給工作流程的不同事件。當然也包括我們建立的 [延遲] 、 [暫停] 、[終結] 。 測試專案。 程式都撰寫完成後,我們按下 [ 啟動] 來建置並且執行這個專案。運氣好的話因該可以看到以下結果。 |