WorkflowPersistenceService.SaveWorkflowInstanceState Método

Definición

Cuando se implementa en una clase derivada, guarda el estado de la instancia de flujo de trabajo en un almacén de datos.

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)

Parámetros

rootActivity
Activity

La actividad raíz de la instancia de flujo de trabajo.

unlock
Boolean

true si no se debe bloquear la instancia de flujo de trabajo; false si se debe bloquear la instancia de flujo de trabajo.

Ejemplos

En el siguiente ejemplo se muestra una implementación del método SaveWorkflowInstanceState. Este ejemplo pertenece a la muestra Servicio de persistencia personalizado, del archivo FilePersistenceService.cs. Para obtener más información, consulte Ejemplo de Custom Persistence Service.

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

Comentarios

Debe llamar a uno de los métodos Save sobrecargados para serializar rootActivity en Stream. A continuación, puede decidir procesar también Stream antes de escribirlo en su almacén de datos. Sin embargo, cuando el motor en tiempo de ejecución de flujo de trabajo llama LoadWorkflowInstanceState, debe restaurar una copia idéntica de la actividad raíz. Si no puede guardar el estado de la instancia de flujo de trabajo en su almacén de datos, debe iniciar PersistenceException con un mensaje de error adecuado.

El motor en tiempo de ejecución de flujo de trabajo proporciona la semántica del bloqueo para restringir el acceso a un estado de la instancia de flujo de trabajo guardado en el almacén de datos. Los servicios de persistencia pueden tener acceso a esto ejecutándose en varios hosts y señalando al mismo almacén de datos. La semántica del bloqueo está diseñada para evitar que los servicios de persistencia que se ejecutan en dos tiempos de ejecución de flujo de trabajo diferentes se carguen a la misma instancia de flujo de trabajo al mismo tiempo en la memoria. Dependiendo del tipo de entorno que pueda admitir su servicio de persistencia, puede decidir si admitir o no esta funcionalidad. Si decide admitir las semántica del bloqueo en tiempo de ejecución, a continuación, si un servicio de persistencia intenta guardar un estado de la instancia de flujo de trabajo bloqueado previamente por otro servicio de persistencia, debe iniciar WorkflowOwnershipException. Si unlock es true, debe desbloquear el acceso al estado de la instancia de flujo de trabajo después de guardarlo.

LoadWorkflowInstanceState toma Guid de la instancia de flujo de trabajo como un parámetro. Por consiguiente, debe guardar este Guid. También puede utilizar Guid para asociar la instancia de flujo de trabajo a los estados guardados de sus ámbitos completados. Debe hacer esto porque debe poder marcar estos ámbitos completados como innecesarios cuando se complete la instancia de flujo de trabajo.

El motor en tiempo de ejecución de flujo de trabajo llama SaveWorkflowInstanceState una hora final cuando la instancia de flujo de trabajo se completa o finaliza. Por consiguiente, si GetWorkflowStatus es igual a Completed o Terminated, puede eliminar sin ningún riesgo la instancia de flujo de trabajo y todos sus ámbitos completados asociados a su almacén de datos. Alternativamente, puede suscribir a WorkflowCompleted o los eventos WorkflowTerminated para determinar cuando está seguro para eliminar registros asociados a la instancia de flujo de trabajo. Si realmente elimina los registros de su almacén de datos depende de su implementación.

Si implementa un servicio de persistencia que utiliza un almacén duradero, a continuación, para mantener la coherencia con el estado interno del motor en runtime de flujo de trabajo, debe participar en procesamiento por lotes de transacción de flujo de trabajo para diferir la escritura real a su almacén duradero hasta un punto de confirmación de flujo de trabajo. Para participar en procesamiento por lotes, agregue un elemento de trabajo que represente los elementos pendientes en su almacén duradero a la propiedad WorkBatch, e implemente la interfaz IPendingWork en su servicio de persistencia.

Se aplica a