Partager via


Traitement d'événements WorkflowRuntime

Le moteur d'exécution de workflow Windows déclenche plusieurs événements tout au long de la durée de sa vie que votre application hôte peut gérer. Ceux-ci se composent des événements qui notifient votre application lorsque le moteur d'exécution est Started ou Stopped, ainsi que plusieurs événements qui correspondent à la durée de vie de toutes les instances de workflow courantes. La procédure permettant de créer des gestionnaires d'événements pour ces événements suit le même modèle de gestion des événements fourni dans le .NET Framework. Par exemple, le code suivant crée un gestionnaire d'événements pour l'événement Started déclenché par l'exécution du workflow lorsqu'il commence l'exécution.

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");
};

Le tableau suivant répertorie les événements qui peuvent être déclenchés par le moteur d'exécution de workflow Windows relatif au moteur d'exécution de workflow lui-même.

Événement Description

ServicesExceptionNotHandled

Déclenché lorsqu'un service dérivé de la classe abstraite WorkflowRuntimeService appelle la méthode RaiseServicesExceptionNotHandledEvent, du fait qu'une exception se produit pendant l'exécution du workflow que le service ne peut pas gérer.

Started

Déclenché lorsque le moteur d'exécution de workflow commence à s'exécuter.

Stopped

Déclenché lorsque le moteur d'exécution de workflow s'arrête.

Le tableau suivant répertorie les événements d'instance de workflow qui peuvent être déclenchés par le moteur d'exécution de workflow.

Événement Description

WorkflowAborted

Déclenché lorsqu'un workflow est arrêté au milieu du traitement.

WorkflowCompleted

Déclenché lorsqu'un workflow termine le traitement.

WorkflowCreated

Déclenché lorsqu'un workflow est instancié.

WorkflowIdled

Déclenché lorsqu'un workflow entre en état d'inactivité.

WorkflowLoaded

Déclenché lorsqu'un workflow est recréé à partir d'un support de stockage.

WorkflowPersisted

Déclenché lorsque l'état actuel du workflow est rendu persistant pour un support de stockage.

WorkflowResumed

Déclenché lorsqu'un workflow continue de s'exécuter après qu'il ait été arrêté ou déchargé.

WorkflowStarted

Déclenché lorsqu'un workflow commence à s'exécuter.

WorkflowSuspended

Déclenché lorsqu'un workflow entre en état suspendu.

WorkflowTerminated

Déclenché lorsqu'un workflow est arrêté.

WorkflowUnloaded

Déclenché lorsqu'un workflow est déchargé.

Conditions WorkflowAbort

Plusieurs conditions distinctes peuvent se produire pendant l'exécution d'un workflow susceptibles de déclencher l'événement WorkflowAborted. Par exemple, une application hôte peut intervenir dans le processus en appelant la méthode Abort d'un objet WorkflowInstance. Dans ce cas, la raison est connue et la logique permettant de gérer cela peut être créée facilement dans l'application hôte elle-même.

Toutefois, il peut également arriver que le moteur d'exécution Windows Workflow Foundation abandonne un workflow. Par exemple, cette condition peut avoir pour résultat l'échec du moteur d'exécution à mettre fin à une instance de workflow. Un scénario courant lié à cette condition concerne le SqlWorkflowPersistenceService. Si le moteur d'exécution de workflow doit terminer un workflow et que le SqlWorkflowPersistenceService est actif, le moteur d'exécution essaiera de rendre l'état du workflow persistant. Toutefois, si une SqlException est levée pendant l'opération de persistance, le moteur d'exécution devra abandonner l'instance de workflow. Lorsque cela se produit, vous pouvez utiliser un TrackingService pour vider les informations sur les exceptions pour déboguer le scénario qui a provoqué l'abandon de l'instance du workflow par le moteur d'exécution.

Déterminer la source de l'arrêt du workflow

L'événement WorkflowTerminated peut être déclenché par programme via l'application hôte, en utilisant une TerminateActivity dans un workflow ou à la suite d'une exception non interceptée. Si votre application hôte doit effectuer une certaine logique basée sur le type d'action qui a provoqué l'arrêt du workflow, vous devrez vérifier plusieurs éléments clés de la logique. Le tableau suivant affiche les différents états d'un workflow et où rechercher plus d'informations sur la raison de l'arrêt.

Action État du workflow État de l'exécution de l'activité Infos sur Terminate ou Suspend

Exécution normale

Terminé

Fermé

NULL

TerminateActivity (raison spécifiée et non NULL)

Arrêté

En cours d'exécution

Raison spécifiée dans la conception du Workflow

TerminateActivity (la raison est NULL)

Arrêté

En cours d'exécution

Une exception de type Workflow Terminated a été levée

Arrêté par l'application hôte

Arrêté

En cours d'exécution

Raison spécifiée dans le paramètre de méthode Terminate

Exception non gérée

Arrêté

Fermé

Message de l'exception à l'origine de l'arrêt

Exception non prise en charge par le gestionnaire d'erreur

Arrêté

Fermé

Message de l'exception à l'origine de l'arrêt

L'emplacement dans le workflow où une exception a été levée peut être recherché en explorant le graphique du workflow et en vérifiant l'état de chaque activité au moment de l'arrêt. Le code suivant montre comment procéder si l'exception est levée à partir d'une 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;
}

Voir aussi

Concepts

Exécution des workflows
Création du WorkflowRuntime

Copyright © 2007 par Microsoft Corporation. Tous droits réservés.