Share via


WorkflowPersistenceService.SaveWorkflowInstanceState Methode

Definition

Bei Implementierung in einer abgeleiteten Klasse, wird der Zustand der Workflowinstanz in einem Datenspeicher gespeichert.

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)

Parameter

rootActivity
Activity

Die Stammaktivität der Workflowinstanz.

unlock
Boolean

true, wenn die Workflowinstanz nicht gesperrt werden soll; false, wenn die Workflowinstanz gesperrt werden soll.

Beispiele

Im folgenden Beispiel wird eine Implementierung der SaveWorkflowInstanceState-Methode gezeigt. Dieses Beispiel stammt aus dem Beispiel zum benutzerdefinierten Persistenzdienst in der Datei FilePersistenceService.cs. Weitere Informationen finden Sie unter Beispiel für den benutzerdefinierten Persistenzdienst.

// 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

Hinweise

Sie müssen eine der überladenen Save-Methoden aufrufen, um rootActivity in einen Stream zu serialisieren. Sie können dann den Stream weiter verarbeiten, bevor Sie ihn in den Datenspeicher schreiben. Wenn jedoch die Workflowruntime-Engine LoadWorkflowInstanceState aufruft, müssen Sie eine identische Kopie der Stammaktivität wiederherstellen. Wenn Sie den Zustand der Workflowinstanz nicht im Datenspeicher speichern können, lösen Sie PersistenceException in Verbindung mit einer entsprechenden Meldung aus.

Die Workflowruntime-Engine stellt eine Sperrsemantik bereit, um den Zugriff auf einen im Datenspeicher gespeicherten Zustand der Workflowinstanz zu beschränken. Auf diesen Zustand können Persistenzdienste zugreifen, die in mehreren Hosts ausgeführt werden und auf denselben Datenspeicher verweisen. Eine Sperrsemantik soll verhindern, dass Persistenzdienste, die in zwei verschiedenen Workflowlaufzeiten ausgeführt werden, gleichzeitig dieselbe Workflowinstanz in den Arbeitsspeicher laden. Ob Sie sich für diese Funktionalität entscheiden, hängt vom Umgebungstyp ab, den der Persistenzdienst unterstützen soll. Wenn Sie sich für die Laufzeitsperrsemantik entscheiden und ein Persistenzdienst versucht dann einen Zustand der Workflowinstanz zu speichern, der bereits von einem anderen Prozess gesperrt wurde, dann sollten Sie WorkflowOwnershipException auslösen. Wenn unlocktrue ist, dann heben Sie die Sperre des Zugriffs auf den Zustand der Workflowinstanz auf, nachdem Sie ihn gespeichert haben.

LoadWorkflowInstanceState übernimmt die Guid der Workflowinstanz als Parameter. Speichern Sie deshalb diese Guid. Sie können die Workflowinstanz mit dieser Guid auch den gespeicherten Zuständen ihrer abgeschlossenen Bereiche zuordnen. Das ist erforderlich, damit Sie diese abgeschlossenen Bereiche beim Abschließen der Workflowinstanz als nicht erforderlich markieren können.

Die Workflowruntime-Engine ruft SaveWorkflowInstanceState auf. Dabei handelt es sich um eine Endzeit, zu der die Workflowinstanz abgeschlossen oder beendet wird. Wenn deshalb GetWorkflowStatus gleich Completed oder Terminated ist, können Sie die Workflowinstanz und alle zugeordneten abgeschlossenen Bereiche sicher aus dem Datenspeicher löschen. Sie können stattdessen auch das WorkflowCompleted- oder das WorkflowTerminated-Ereignis abonnieren, um zu bestimmen, ob die Datensätze sicher gelöscht werden können, die der Workflowinstanz zugeordnet sind. Ob Sie die Datensätze tatsächlich aus dem Datenspeicher löschen, hängt von der Implementierung ab.

Verwenden Sie die Batchverarbeitung für Workflowtransaktionen, wenn Sie einen Persistenzdienst implementieren, der einen permanenten Speicher verwendet. Dadurch wird die Konsistenz mit dem internen Zustand der Workflowruntime-Engine aufrechterhalten, indem der tatsächlichen Schreibvorgang bis zu einem Commitpunkt des Workflows verzögert wird. Damit die Batchverarbeitung für Workflowtransaktionen verwendet wird, fügen Sie der WorkBatch-Eigenschaft eine Arbeitsaufgabe hinzu, die die ausstehenden Änderungen am permanenten Speicher darstellt. Implementieren Sie außerdem die IPendingWork-Schnittstelle in Ihrem Persistenzdienst.

Gilt für: