HOW TO:建立與執行長期執行的工作流程
本主題僅適用於 Windows Workflow Foundation 4。
Windows Workflow Foundation (WF) 的其中一個核心功能,就是執行階段可持續閒置的工作流程,以及將其卸載至資料庫中。 本主題說明如何建立工作流程持續性的本機資料庫,以及如何啟用工作流程應用程式的持續性。
注意: |
---|
「使用者入門」教學課程中的每個主題都會與前一個主題息息相關。 若要完成此主題,您必須先完成 HOW TO:建立活動、HOW TO:建立工作流程和 HOW TO:執行工作流程。 |
若要建立持續性資料庫
開啟 SQL Server Management Studio 並連線至本機伺服器。 以滑鼠右鍵按一下本機伺服器的 [資料庫] 節點,然後選取 [新增資料庫]。 將新資料庫命名為 Persistence,接受所有其他的值,然後選取 [確定]。
注意: 嘗試建立新資料庫之前,請確定您在本機伺服器上有 [建立資料庫] 權限。 以滑鼠右鍵按一下新的 Persistence 資料庫,然後選取 [新增查詢]。 開啟下列資料夾:C:\Windows\Microsoft.NET\Framework\<current version>\sql\en。 將下列檔案拖曳至查詢視窗,並以下列順序執行這些檔案:
SqlWorkflowInstanceStoreSchema.sql
SqlWorkflowInstanceStoreLogic.sql
若要啟用工作流程應用程式的持續性
以滑鼠右鍵按一下 [方案總管] 中的 [WorkflowConsoleApplication1],並選取 [加入參考]。
選取 [.NET] 標籤中的 [System.Activities.DurableInstancing] 和 [System.Runtime.DurableInstancing],並按一下 [確定]。
開啟 [WorkflowConsoleApplication1] 專案中的 [Program.cs] (在 Visual Basic 中為 Module1.vb)。 在
Program
類別 (在 Visual Basic 中為Module1
) 中,宣告定義持續性資料庫連接字串的字串常數,此資料庫是您在第一個程序中所建立的。Const connectionString As String = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI"
const string connectionString = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI";
注意: 視 SQL Server 版本而定,連接字串的伺服器名稱可能有所不同。 接著,在 Program.cs 或 Module1.vb 檔案中,加入
System.Activities.DurableInstancing
的 using 或 Imports 陳述式。Imports System.Activities.DurableInstancing
using System.Activities.DurableInstancing;
在建立 WorkflowApplication 的程式碼之後的
Main
方法中,建立 SqlWorkflowInstanceStore 並將它指派到 WorkflowApplication 的 InstanceStore。Dim inputs As New Dictionary(Of String, Object) inputs.Add("MaxNumber", 100) Dim wfApp As New WorkflowApplication(New Workflow1(), inputs) Dim store As New SqlWorkflowInstanceStore(connectionString) wfApp.InstanceStore = store
WorkflowApplication wfApp = new WorkflowApplication(new Workflow1(), inputs); SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString); wfApp.InstanceStore = store;
接著,告知工作流程在閒置時要持續。 若要這麼做,請取代上一個主題中加入之
Idle
事件的委派,並以處理 PersistableIdle 的下列程式碼加以取代。' Replace the Idle handler with a PersistableIdle handler. 'wfApp.Idle = _ ' Sub(e As WorkflowApplicationIdleEventArgs) ' idleEvent.Set() ' End Sub wfApp.PersistableIdle = _ Function(e As WorkflowApplicationIdleEventArgs) idleEvent.Set() Return PersistableIdleAction.Persist End Function
// Replace the Idle handler with a PersistableIdle handler. //wfApp.Idle = delegate(WorkflowApplicationIdleEventArgs e) //{ // idleEvent.Set(); //}; wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e) { idleEvent.Set(); return PersistableIdleAction.Persist; };
注意: PersistableIdleAction 列舉有三個值:None、Persist 與 Unload。Persist 會導致工作流程持續,但不會導致工作流程卸載。Unload 會導致工作流程持續並加以卸載。 卸載執行個體之後,就會處置 WorkflowApplication,並且需要新的 WorkflowApplication 物件以進行下一次與卸載之工作流程的互動。 在這個主題中會使用 Persist
,因此工作流程會保存在記憶體中,且不會處置 WorkflowApplication。 如需使用包含 Unload 列舉值的 WorkflowApplication,請參閱持續工作流程應用程式 範例。在
Main
方法結尾,請加入以下幾行程式碼。WorkflowApplication 會在遊戲完成時自動從記憶體中卸載工作流程執行個體,並從資料庫中移除持續性記錄。Console.WriteLine("Press any key to continue . . .") Console.ReadKey()
Console.WriteLine("Press any key to continue . . ."); Console.ReadKey();
注意: 當工作流程完成時,就會移除工作流程的持續性記錄。 在這個範例中,如果沒有 Console.ReadKey,主應用程式會在工作流程完成時隨即結束。 因為持續性清理是發生於背景執行緒中,所以如果主機在清理完成前先終止,就沒有機會完成此作業。 另一個避免主機在持續性作業完成前結束的方式,就是封鎖主機,直到工作流程完成後發生 Unloaded 事件為止。 在工作流程完成之後,直到背景工作 (例如從持續性中移除已完成的工作流程) 完成之後才會卸載工作流程。 若要測試持續性,請按下 F5 來啟動應用程式,並切換至 SQL Server Management Studio。 展開 Persistence 資料庫節點 (如果您在 Master 資料庫中建立持續性資料表,則為 Master 資料庫節點),以及 Persistence 資料庫中的資料表節點。 以滑鼠右鍵按一下 InstancesTable 資料表,然後選取 [選取前 1000 個資料列]。 此時應會顯示一列,包含持續之工作流程的工作流程 ID。
接著,執行一次此遊戲以完成工作流程。 遊戲結束後,返回 SQL Server Management Studio,並再次執行查詢。 請注意,這並不會傳回任何持續性記錄。
您已完成「使用者入門教學課程」。