共用方式為


HOW TO:建立與執行長期執行的工作流程

本主題僅適用於 Windows Workflow Foundation 4。

Windows Workflow Foundation (WF) 的其中一個核心功能,就是執行階段可持續閒置的工作流程,以及將其卸載至資料庫中。 本主題說明如何建立工作流程持續性的本機資料庫,以及如何啟用工作流程應用程式的持續性。

Dd489452.note(zh-tw,VS.100).gif注意:
「使用者入門」教學課程中的每個主題都會與前一個主題息息相關。 若要完成此主題,您必須先完成 HOW TO:建立活動HOW TO:建立工作流程HOW TO:執行工作流程

若要建立持續性資料庫

  1. 開啟 SQL Server Management Studio 並連線至本機伺服器。 以滑鼠右鍵按一下本機伺服器的 [資料庫] 節點,然後選取 [新增資料庫]。 將新資料庫命名為 Persistence,接受所有其他的值,然後選取 [確定]。

    Dd489452.note(zh-tw,VS.100).gif注意:
    嘗試建立新資料庫之前,請確定您在本機伺服器上有 [建立資料庫] 權限。

  2. 以滑鼠右鍵按一下新的 Persistence 資料庫,然後選取 [新增查詢]。 開啟下列資料夾:C:\Windows\Microsoft.NET\Framework\<current version>\sql\en。 將下列檔案拖曳至查詢視窗,並以下列順序執行這些檔案:

    • SqlWorkflowInstanceStoreSchema.sql

    • SqlWorkflowInstanceStoreLogic.sql

若要啟用工作流程應用程式的持續性

  1. 以滑鼠右鍵按一下 [方案總管] 中的 [WorkflowConsoleApplication1],並選取 [加入參考]。

  2. 選取 [.NET] 標籤中的 [System.Activities.DurableInstancing] 和 [System.Runtime.DurableInstancing],並按一下 [確定]。

  3. 開啟 [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";
    
    Dd489452.note(zh-tw,VS.100).gif注意:
    視 SQL Server 版本而定,連接字串的伺服器名稱可能有所不同。

  4. 接著,在 Program.csModule1.vb 檔案中,加入 System.Activities.DurableInstancingusingImports 陳述式。

    Imports System.Activities.DurableInstancing
    
    using System.Activities.DurableInstancing;
    
  5. 在建立 WorkflowApplication 的程式碼之後的 Main 方法中,建立 SqlWorkflowInstanceStore 並將它指派到 WorkflowApplicationInstanceStore

    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;
    
  6. 接著,告知工作流程在閒置時要持續。 若要這麼做,請取代上一個主題中加入之 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;
    };
    
    Dd489452.note(zh-tw,VS.100).gif注意:
    PersistableIdleAction 列舉有三個值:NonePersistUnloadPersist 會導致工作流程持續,但不會導致工作流程卸載。Unload 會導致工作流程持續並加以卸載。 卸載執行個體之後,就會處置 WorkflowApplication,並且需要新的 WorkflowApplication 物件以進行下一次與卸載之工作流程的互動。 在這個主題中會使用 Persist,因此工作流程會保存在記憶體中,且不會處置 WorkflowApplication。 如需使用包含 Unload 列舉值的 WorkflowApplication,請參閱持續工作流程應用程式 範例。

  7. Main 方法結尾,請加入以下幾行程式碼。WorkflowApplication 會在遊戲完成時自動從記憶體中卸載工作流程執行個體,並從資料庫中移除持續性記錄。

    Console.WriteLine("Press any key to continue . . .")
    Console.ReadKey()
    
    Console.WriteLine("Press any key to continue . . .");
    Console.ReadKey();
    
    Dd489452.note(zh-tw,VS.100).gif注意:
    當工作流程完成時,就會移除工作流程的持續性記錄。 在這個範例中,如果沒有 Console.ReadKey,主應用程式會在工作流程完成時隨即結束。 因為持續性清理是發生於背景執行緒中,所以如果主機在清理完成前先終止,就沒有機會完成此作業。 另一個避免主機在持續性作業完成前結束的方式,就是封鎖主機,直到工作流程完成後發生 Unloaded 事件為止。 在工作流程完成之後,直到背景工作 (例如從持續性中移除已完成的工作流程) 完成之後才會卸載工作流程。

  8. 若要測試持續性,請按下 F5 來啟動應用程式,並切換至 SQL Server Management Studio。 展開 Persistence 資料庫節點 (如果您在 Master 資料庫中建立持續性資料表,則為 Master 資料庫節點),以及 Persistence 資料庫中的資料表節點。 以滑鼠右鍵按一下 InstancesTable 資料表,然後選取 [選取前 1000 個資料列]。 此時應會顯示一列,包含持續之工作流程的工作流程 ID。

    接著,執行一次此遊戲以完成工作流程。 遊戲結束後,返回 SQL Server Management Studio,並再次執行查詢。 請注意,這並不會傳回任何持續性記錄。

    您已完成「使用者入門教學課程」。