長時間にわたって実行されるワークフローを作成して実行する方法

このトピックの内容は、Windows Workflow Foundation 4 に該当します。

Windows Workflow Foundation (WF) の中心的な機能の 1 つは、アイドル状態のワークフローをデータベースにアップロードできる実行時の機能です。ここでは、ワークフローの永続化のためにローカル データベースを作成する方法と、ワークフロー アプリケーションで永続化を有効にする方法について説明します。

Dd489452.note(ja-jp,VS.100).gif注 :
チュートリアル入門の各トピックは、前のトピックに応じて異なります。このトピックを完了する前に、「アクティビティを作成する方法」、「ワークフローを作成する方法」、および「ワークフローを実行する方法」を完了する必要があります。

永続性データベースを作成するには

  1. SQL Server Management Studio を開き、ローカル サーバーに接続します。ローカル サーバーの [Databases] ノードを右クリックし、[新しいデータベース] をクリックします。新しいデータベースに Persistence という名前を付け、その他の値はすべて受け入れ、[OK] をクリックします。

    Dd489452.note(ja-jp,VS.100).gif注 :
    新しいデータベースを作成する前に、ローカル サーバーに対する Create Database 権限があることを確認してください。

  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] を選択し、[OK] をクリックします。

  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(ja-jp,VS.100).gif注 :
    使用している SQL Server のエディションによって、接続文字列のサーバー名は異なる可能性があります。

  4. 次に、Program.cs または Module1.vb ファイルで、System.Activities.DurableInstancingusing または Imports ステートメントを追加します。

    Imports System.Activities.DurableInstancing
    
    using System.Activities.DurableInstancing;
    
  5. Main メソッドでは、WorkflowApplication を作成するコードに続けて、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(ja-jp,VS.100).gif注 :
    PersistableIdleAction 列挙型には、NonePersist、および Unload という 3 つの値があります。Persist によってワークフローは永続化されますが、ワークフローはアップロードされません。Unload によってワークフローは永続化およびアップロードされます。インスタンスがアップロードされた後に、WorkflowApplication は破棄されるため、アップロードしたワークフローを使用する次のやり取りには新しい WorkflowApplication オブジェクトが必要です。このトピックでは Persist を使用するため、ワークフローはメモリに残り、WorkflowApplication は破棄されません。WorkflowApplicationUnload 列挙値を使用する例については、「ワークフロー アプリケーションの永続化」のサンプルを参照してください。

  7. Main メソッドの末尾に、次のコード行を追加します。WorkflowApplication によって、ゲームの完了後にメモリからワークフロー インスタンスがアンロードされ、データベースの永続性レコードは削除されます。

    Console.WriteLine("Press any key to continue . . .")
    Console.ReadKey()
    
    Console.WriteLine("Press any key to continue . . .");
    Console.ReadKey();
    
    Dd489452.note(ja-jp,VS.100).gif注 :
    ワークフローが完了すると、ワークフローの永続性レコードは削除されます。この例では、Console.ReadKey を使用せずに、ワークフローが完了するとすぐにホスト アプリケーションが終了します。永続性の消去はバックグラウンド スレッドで発生するため、消去作業の完了前にホストが停止しても作業を完了する機会はありません。永続化の操作が完了する前にホストが終了することを回避するには、ワークフローの完了後に Unloaded イベントが発生するまでホストがブロックするという方法もあります。ワークフローが完了した後に、完了したワークフローを永続化から削除するなどのバックグラウンド作業が完了するまで、ワークフローはアンロードされません。

  8. 永続化をテストするには、F5 キーを押してアプリケーションを起動し、SQL Server Management Studio に切り替えます。[Persistence] データベース ノード (Master データベース内に永続化テーブルを作成している場合は [Master] データベース ノード)、および Persistence データベースの [Tables] ノードを展開します。InstancesTable テーブルを右クリックし、[上位 1000 行を選択] をクリックします。永続化されたワークフローのワークフロー ID を含む 1 行が表示されます。

    次に、ゲームを通してプレイし、ワークフローを完了します。ゲームが終了したら、SQL Server Management Studio に戻り、もう一度クエリを実行します。永続性レコードが返されないことに注意してください。

    これでチュートリアル入門は完了です。