Compartir a través de


Procesamiento de eventos WorkflowRuntime

El motor de tiempo de ejecución de Windows Workflow provoca varios eventos a lo largo de su duración que su aplicación host puede administrar. Éstos están compuestos de eventos que informan a su aplicación cuando el motor de tiempo de ejecución es Started o Stopped, y también varios eventos que corresponden a la duración de cualquier instancia de flujo de trabajo en ejecución. El procedimiento para crear controladores de eventos para estos eventos sigue el mismo modelo de control de eventos proporcionado en .NET Framework. Como ejemplo, el código siguiente crea un controlador de eventos para el evento Started elevado por el flujo de trabajo en tiempo de ejecución cuando comienza la ejecución.

AddHandler workflowRuntime.Started, AddressOf OnWorkflowStarted
...
Shared Sub OnWorkflowStarted(ByVal sender As Object, ByVal e As WorkflowRuntimeEventArgs)
    Console.WriteLine("WorkflowRuntime started")
End Sub
workflowRuntime.Started += delegate(object sender, WorkflowRuntimeEventArgs e)
{
    Console.WriteLine("WorkflowRuntime started");
};

La tabla siguiente muestra una lista de los eventos que pueden ser provocados por el motor de tiempo de ejecución de Windows Workflow que pertenece al mismo motor de tiempo de ejecución del flujo de trabajo.

Evento Descripción

ServicesExceptionNotHandled

Se genera cuando un servicio que se deriva de la clase abstracta WorkflowRuntimeService llama al método RaiseServicesExceptionNotHandledEvent, porque ocurre una excepción durante la ejecución del flujo de trabajo que el servicio no puede administrar.

Started

Se genera cuando el motor de tiempo de ejecución del flujo de trabajo inicia el funcionamiento.

Stopped

Se genera cuando el motor de tiempo de ejecución del flujo de trabajo finaliza el funcionamiento.

La tabla siguiente hace una lista de los eventos de instancia de flujo de trabajo que pueden ser provocados por el motor de tiempo de ejecución del flujo de trabajo.

Evento Descripción

WorkflowAborted

Se genera cuando un flujo de trabajo se detiene en el medio del procesamiento.

WorkflowCompleted

Se genera cuando un flujo de trabajo completa el procesamiento.

WorkflowCreated

Se genera cuando se crean instancias de un flujo de trabajo.

WorkflowIdled

Se genera cuando un flujo de trabajo entra en estado inactivo.

WorkflowLoaded

Se genera cuando un flujo de trabajo se vuelve a crear desde un medio de almacenamiento.

WorkflowPersisted

Se genera cuando el estado actual del flujo de trabajo se conserva en un medio de almacenamiento.

WorkflowResumed

Se genera cuando un flujo de trabajo reanuda la ejecución una vez detenido o descargado.

WorkflowStarted

Se genera cuando un flujo de trabajo inicia el funcionamiento.

WorkflowSuspended

Se genera cuando un flujo de trabajo entra en estado de suspensión.

WorkflowTerminated

Se genera cuando se finaliza un flujo de trabajo.

WorkflowUnloaded

Se genera cuando se descarga un flujo de trabajo.

Condiciones de WorkflowAbort

Hay varias condiciones diferentes que pueden producirse durante la ejecución de un flujo de trabajo que pueden generar el evento WorkflowAborted. Por ejemplo, una aplicación host puede intervenir en el proceso llamando al método Abort desde un objeto WorkflowInstance. En este caso, la razón se conoce y la lógica para administrar esto se puede crear con facilidad en la propia aplicación host.

Sin embargo, hay condiciones en que el motor de tiempo de ejecución de Windows Workflow Foundation anulará un flujo de trabajo. Un ejemplo de esta condición es un resultado en que el motor de tiempo de ejecución no puede finalizar una instancia de flujo de trabajo. Un escenario común relacionado con esta condición involucra SqlWorkflowPersistenceService. Si el motor de tiempo de ejecución del flujo de trabajo necesita finalizar un flujo de trabajo y SqlWorkflowPersistenceService está activo, el motor de tiempo de ejecución intentará conservar el estado del flujo de trabajo. Sin embargo, si SqlException se inicia durante la operación de persistencia, el motor de tiempo de ejecución tendrá que anular la instancia de flujo de trabajo. Cuando esto se produce, puede utilizar TrackingService para volcar la información de excepción con el fin de depurar el escenario que hizo que el motor de tiempo de ejecución anulara la instancia de flujo de trabajo.

Determinar la fuente de finalización del flujo de trabajo

El evento WorkflowTerminated se puede generar mediante programación a través de la aplicación host, utilizando TerminateActivity en un flujo de trabajo, o como resultado de una excepción no detectada. Si su aplicación host necesita realizar cierta lógica basada en el tipo de acción que hizo que el flujo de trabajo finalizara, hay varias piezas clave de lógica que necesitará comprobar. La tabla siguiente muestra estados diferentes de un flujo de trabajo y dónde buscar información con respecto a la razón de la finalización.

Acción Estado del flujo de trabajo Estado de ejecución de la actividad Información de finalizar o suspender

Ejecución normal

Finalizado

Cerrado

NULL

TerminateActivity (Razón especificada y no NULL)

Finalizado

En ejecución

La razón especificada en diseño de flujo de trabajo

TerminateActivity (la razón es NULL)

Terminated

En ejecución

Se ha iniciado una excepción del tipo Flujo de trabajo Finalizado

Se finaliza desde la aplicación host

Terminated

En ejecución

La razón especificada en el parámetro de método de finalización

Excepción no controlada

Terminated

Closed

Mensaje de la excepción que produce la finalización

Excepción no controlada en el controlador del error

Terminated

Closed

Mensaje de la excepción que produce la finalización

La ubicación en el flujo de trabajo donde se produce una excepción se puede buscar examinando el grafo del flujo de trabajo y comprobando el estado de cada actividad en el momento de la finalización. El código siguiente muestra cómo lograr esto si la excepción se produce desde FaultHandlerActivity.

Private Function isExceptionfromFaultHandler(ByVal rootActivity As Activity) As Boolean
    If rootActivity Is Nothing Then
        Return False
    End If
    If TypeOf rootActivity Is CompositeActivity Then
        If TypeOf rootActivity Is FaultHandlersActivity Then
            If rootActivity.ExecutionStatus = ActivityExecutionStatus.Closed Then
                Return True
            End If
        End If

        For Each act As Activity In (CType(rootActivity, CompositeActivity)).Activities
            If isExceptionfromFaultHandler(act) Then
                Return True
            End If
        Next
    End If
    Return False
End Function
bool isExceptionfromFaultHandler(Activity rootActivity)
{
    if (rootActivity == null)
        return false;
    if (rootActivity is CompositeActivity)
    {
        if (rootActivity is FaultHandlersActivity)
        {
            if (rootActivity.ExecutionStatus == ActivityExecutionStatus.Closed)
                return true;
        }

        foreach (Activity act in ((CompositeActivity)rootActivity).Activities)
            if (isExceptionfromFaultHandler(act))
                return true;
    }
    return false;
}

Consulte también

Conceptos

Ejecución de flujos de trabajo
Creación de WorkflowRuntime

Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.