次の方法で共有


WorkflowPersistenceService.SaveWorkflowInstanceState メソッド

定義

派生クラスとして実装された場合、ワークフロー インスタンス状態をデータ ストアに保存します。

protected public:
 abstract void SaveWorkflowInstanceState(System::Workflow::ComponentModel::Activity ^ rootActivity, bool unlock);
protected internal abstract void SaveWorkflowInstanceState (System.Workflow.ComponentModel.Activity rootActivity, bool unlock);
abstract member SaveWorkflowInstanceState : System.Workflow.ComponentModel.Activity * bool -> unit
Protected Friend MustOverride Sub SaveWorkflowInstanceState (rootActivity As Activity, unlock As Boolean)

パラメーター

rootActivity
Activity

ワークフロー インスタンスのルート アクティビティ。

unlock
Boolean

ワークフロー インスタンスをロックしない場合は true、ロックする場合は false

SaveWorkflowInstanceState メソッドの実装例を次に示します。 この例は、FilePersistenceService.cs ファイルに含まれているカスタム永続性サービスのサンプルです。 詳細については、「 カスタム永続化サービスのサンプル」を参照してください。

// Save the workflow instance state at the point of persistence with option of locking the instance state if it is shared
// across multiple runtimes or multiple phase instance updates
protected override void SaveWorkflowInstanceState(Activity rootActivity, bool unlock)
{
    // Save the workflow
    Guid contextGuid = (Guid)rootActivity.GetValue(Activity.ActivityContextGuidProperty);
    Console.WriteLine("Saving instance: {0}\n", contextGuid);
    SerializeToFile(
        WorkflowPersistenceService.GetDefaultSerializedForm(rootActivity), contextGuid);

    // See when the next timer (Delay activity) for this workflow will expire
    TimerEventSubscriptionCollection timers = (TimerEventSubscriptionCollection)rootActivity.GetValue(TimerEventSubscriptionCollection.TimerCollectionProperty);
    TimerEventSubscription subscription = timers.Peek();
    if (subscription != null)
    {
        // Set a system timer to automatically reload this workflow when its next timer expires
        TimerCallback callback = new TimerCallback(ReloadWorkflow);
        TimeSpan timeDifference = subscription.ExpiresAt - DateTime.UtcNow;
        System.Threading.Timer timer = new System.Threading.Timer(
            callback,
            subscription.WorkflowInstanceId,
            timeDifference < TimeSpan.Zero ? TimeSpan.Zero : timeDifference,
            new TimeSpan(-1));
    }
}
' Save the workflow instance state at the point of persistence with option of locking the instance state if it is shared
' across multiple runtimes or multiple phase instance updates
Protected Overrides Sub SaveWorkflowInstanceState(ByVal rootActivity As System.Workflow.ComponentModel.Activity, ByVal unlock As Boolean)
    Dim contextGuid As Guid = CType(rootActivity.GetValue(Activity.ActivityContextGuidProperty), Guid)
    Console.WriteLine("Saving instance: 0}" + vbLf, contextGuid)
    SerializeToFile( _
        WorkflowPersistenceService.GetDefaultSerializedForm(rootActivity), contextGuid)

    ' See when the next timer (Delay activity) for this workflow will expire
    Dim timers As TimerEventSubscriptionCollection = CType(rootActivity.GetValue(TimerEventSubscriptionCollection.TimerCollectionProperty), TimerEventSubscriptionCollection)
    Dim subscription As TimerEventSubscription = timers.Peek()
    If subscription IsNot Nothing Then
        ' Set a system timer to automatically reload this workflow when it's next timer expires
        Dim timeDifference As TimeSpan = subscription.ExpiresAt - DateTime.UtcNow
        Dim callback As TimerCallback = New TimerCallback(AddressOf ReloadWorkflow)
        Dim timer As New System.Threading.Timer( _
            callback, _
            subscription.WorkflowInstanceId, _
            CType(IIf(timeDifference < TimeSpan.Zero, TimeSpan.Zero, timeDifference), TimeSpan), _
            New TimeSpan(-1))
    End If
End Sub

注釈

オーバーロードされた Save メソッドの 1 つを呼び出し、rootActivityStream にシリアル化する必要があります。 その後、Stream を追加処理してからデータ ストアに書き込むこともできます。 ただし、ワークフロー ランタイム エンジンが LoadWorkflowInstanceState を呼び出したときは、ルート アクティビティの完全なコピーを復元する必要があります。 ワークフロー インスタンス状態をデータ ストアに保存できなかった場合は、適切なエラー メッセージを含めた PersistenceException をスローする必要があります。

ワークフロー ランタイム エンジンは、データ ストアに保存されたワークフロー インスタンス状態へのアクセスを制限するためのロック セマンティクスを提供します。 これは、複数のホストで実行される、同じデータ ストアを指す永続性サービスによって利用されます。 ロック セマンティクスは、2 つの異なるワークフロー ランタイムで実行される永続性サービスが同時に同じワークフロー インスタンスをメモリに読み込むことを防ぐように設計されています。 永続性サービスがサポートする目的の環境のタイプに応じて、この機能をサポートするかどうかを選択できます。 ランタイム ロック セマンティクスをサポートすることにした場合、永続性サービスが保存しようとしているワークフロー インスタンス状態が別の永続性サービスによって既にロックされているときは、WorkflowOwnershipException をスローする必要があります。 unlocktrue にした場合、ワークフロー インスタンス状態を保存した後、保存したワークフロー インスタンス状態へのアクセスのロックを解除する必要があります。

LoadWorkflowInstanceState は、ワークフロー インスタンスの Guid をパラメーターとして受け取ります。 したがって、この Guid を保存する必要があります。 また、この Guid を使用して、ワークフロー インスタンスを、保存されたその完了スコープの状態に関連付けることができます。 この操作は必須です。これは、ワークフロー インスタンスが完了したときに、このような完了スコープを不要とマークすることが可能である必要があるためです。

ワークフロー インスタンスが完了または終了した最終的な時点で、ワークフロー ランタイム エンジンは SaveWorkflowInstanceState を呼び出します。 したがって、GetWorkflowStatusCompleted または Terminated になった場合は、ワークフロー インスタンスとそれに関連付けられたすべての完了スコープを、データ ストアから安全に削除できます。 あるいは、WorkflowCompleted イベントまたは WorkflowTerminated イベントに定期受信することによって、ワークフロー インスタンスに関連付けられたレコードを安全に削除できるタイミングを判断することもできます。 データ ストアからレコードを実際に削除するかどうかは、実装に依存します。

永続的ストアを使用する永続性サービスを実装する場合は、ワークフロー ランタイム エンジンの内部状態との整合性を維持するために、ワークフロー トランザクション バッチに参加する必要があります。こうすることで、永続的ストアへの実際の書き込みをワークフロー コミット ポイントに達するまで遅らせます。 バッチに参加するには、永続的ストアに対する保留中の変更を表す作業項目を WorkBatch プロパティに追加し、永続性サービスに IPendingWork インターフェイスを実装します。

適用対象