Partager via


WorkflowPersistenceService.SaveWorkflowInstanceState Méthode

Définition

En cas d'implémentation dans une classe dérivée, enregistrer l'état de l'instance de workflow dans un magasin de données.

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)

Paramètres

rootActivity
Activity

Activité racine de l'instance de workflow.

unlock
Boolean

true si l'instance de workflow ne doit pas être verrouillée ; false si l'instance de workflow doit être verrouillée.

Exemples

L'exemple suivant illustre une implémentation de la méthode SaveWorkflowInstanceState. Il provient de l'exemple de Custom Persistence Service, dans le fichier FilePersistenceService.cs. Pour plus d’informations, consultez Exemple de service de persistance personnalisée.

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

Remarques

Vous devez appeler l'une des méthodes Save surchargées pour sérialiser rootActivity dans une classe Stream. Vous pouvez ensuite choisir de traiter encore plus Stream avant de l'écrire dans votre banque de données. Toutefois, lorsque le moteur d'exécution de workflow appelle la méthode LoadWorkflowInstanceState, vous devez restaurer une copie identique de l'activité racine. Si vous ne pouvez pas enregistrer l'état de l'instance de workflow dans votre banque de données, vous devez lever une classe PersistenceException avec un message d'erreur approprié.

Le moteur d'exécution de workflow fournit la sémantique de verrouillage pour restreindre l'accès à l'état d'une instance de workflow enregistrée dans une banque de données. Vous pouvez y accéder en exécutant les services de persistance sur plusieurs hôtes et en pointant sur la même banque de données. La sémantique de verrouillage est conçue pour empêcher les services de persistance qui s'exécutent dans deux processus différents de charger en même temps la même instance de workflow en mémoire. Selon le type d'environnement que votre service de persistance peut prendre en charge, vous avez la possibilité d'utiliser ces fonctionnalités. Si vous choisissez de prendre en charge la sémantique de verrouillage d'exécution, puis, si un service de persistance essaie d'enregistrer une instance de workflow verrouillée précédemment par un autre service de persistance, vous devez lever une classe WorkflowOwnershipException. Si unlock est true, vous devez déverrouiller l'accès à l'état de l'instance de workflow après l'avoir enregistrée.

LoadWorkflowInstanceState prend le Guid de l'instance de workflow en tant que paramètre. Par conséquent, vous devez enregistrer ce Guid. Vous pouvez également utiliser ce Guid pour associer l'instance de workflow aux états enregistrés de ses objectifs achevés. Vous devez effectuer cette opération parce que vous devez être en mesure de marquer ces objectifs achevés comme non requis lorsque l'instance de workflow se termine.

Le moteur d'exécution de workflow appelle la méthode SaveWorkflowInstanceState une dernière fois lorsque l'instance de workflow est complétée ou interrompue. Par conséquent, si GetWorkflowStatus est égal à Completed ou Terminated, vous pouvez supprimer sans risque l'instance de workflow et tous les objectifs achevés qui lui sont associés dans votre banque de données. Vous pouvez également vous abonner à l'événement WorkflowCompleted ou WorkflowTerminated pour déterminer si vous pouvez supprimer en toute sécurité les enregistrements associés à l'instance de workflow. La suppression réelle des enregistrements de votre banque de données dépend de votre implémentation.

Si vous implémentez un service de persistance qui utilise un magasin fiable, afin de maintenir la cohérence avec l'état interne du moteur d'exécution de workflow, vous devez ensuite participer au traitement par lots de la transaction du workflow pour différer l'écriture réelle dans votre magasin fiable jusqu'à un point de la validation du workflow. Pour participer au traitement par lots, ajoutez un élément de travail à la propriété WorkBatch qui représente les modifications à apporter à votre banque de données et implémentez l’interface IPendingWork dans votre service de persistance.

S’applique à