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 |
---|---|
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 | ||
---|---|---|---|
Se genera cuando un flujo de trabajo se detiene en el medio del procesamiento. |
|||
Se genera cuando un flujo de trabajo completa el procesamiento. |
|||
Se genera cuando se crean instancias de un flujo de trabajo. |
|||
Se genera cuando un flujo de trabajo entra en estado inactivo. |
|||
Se genera cuando un flujo de trabajo se vuelve a crear desde un medio de almacenamiento. |
|||
Se genera cuando el estado actual del flujo de trabajo se conserva en un medio de almacenamiento. |
|||
Se genera cuando un flujo de trabajo reanuda la ejecución una vez detenido o descargado. |
|||
Se genera cuando un flujo de trabajo inicia el funcionamiento. |
|||
Se genera cuando un flujo de trabajo entra en estado de suspensión. |
|||
Se genera cuando se finaliza un flujo de trabajo. |
|||
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.