Freigeben über


Verarbeiten von WorkflowRuntime-Ereignissen

Vom Windows-Workflow-Laufzeitmodul werden während seiner gesamten Lebensdauer mehrere Ereignisse ausgelöst, die von der Hostanwendung behandelt werden können. Diese bestehen aus Ereignissen, von denen die Anwendung benachrichtigt wird, wenn das Laufzeitmodul Started oder Stopped wird, und auch aus mehreren Ereignissen, die der Lebensdauer von beliebigen Laufzeitworkflowinstanzen entsprechen. Die Prozedur zum Erstellen von Ereignishandlern für diese Ereignisse folgt demselben Ereignishandlermuster wie im .NET Framework bereitgestellt. Durch folgenden Code wird z. B. ein Ereignishandler für das Started-Ereignis erstellt, der zu Beginn der Ausführung durch die Workflowlaufzeit ausgelöst wird.

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

In der folgenden Tabelle werden die Ereignisse aufgelistet, die vom Windows-Workflow-Laufzeitmodul ausgelöst werden können und die zum Workflow-Laufzeitmodul selbst gehören.

Ereignis Beschreibung

ServicesExceptionNotHandled

Wird ausgelöst, wenn durch einen vom WorkflowRuntimeService der abstrakten Klasse abgeleiteten Dienst die RaiseServicesExceptionNotHandledEvent-Methode aufgerufen wird, weil während der Workflowausführung eine Ausnahme zurückgegeben wird, die nicht vom Dienst behandelt werden kann.

Started

Wird zu Beginn der Ausführung des Workflow-Laufzeitmoduls ausgelöst.

Stopped

Wird zu Ende der Ausführung des Workflow-Laufzeitmoduls ausgelöst.

In der folgenden Tabelle werden die Workflowinstanzereignisse aufgelistet, die vom Workflow-Laufzeitmodul ausgelöst werden können.

Ereignis Beschreibung

WorkflowAborted

Wird ausgelöst, wenn ein Workflow während der Verarbeitung angehalten wird.

WorkflowCompleted

Wird ausgelöst, wenn die Verarbeitung eines Workflows Verarbeiten abgeschlossen ist.

WorkflowCreated

Wird ausgelöst, wenn ein Workflow instanziiert wird.

WorkflowIdled

Wird ausgelöst, wenn ein Workflow in den Leerlauf wechselt.

WorkflowLoaded

Wird ausgelöst, wenn ein Workflow von einem Speichermedium aus neu erstellt wird.

WorkflowPersisted

Wird ausgelöst, wenn der aktuelle Zustand des Workflows in einem Speichermedium beibehalten wird.

WorkflowResumed

Wird ausgelöst, wenn die Ausführung eines Workflows fortgesetzt wird, nachdem sie angehalten oder entladen wurde.

WorkflowStarted

Wird zu Beginn der Ausführung eines Workflows ausgelöst.

WorkflowSuspended

Wird ausgelöst, wenn ein Workflow in den unterbrochenen Zustand wechselt.

WorkflowTerminated

Wird ausgelöst, wenn ein Workflow beendet wird.

WorkflowUnloaded

Wird ausgelöst, wenn ein Workflow entladen wird.

WorkflowAbort-Bedingungen

Während der Ausführung eines Workflows können mehrere verschiedene Bedingungen eintreten, durch die das WorkflowAborted-Ereignis ausgelöst werden kann. Eine Hostanwendung kann z. B. während des Vorgangs eingreifen, indem die Abort-Methode über ein WorkflowInstance-Objekt aufgerufen wird. In diesem Fall ist der Grund bekannt und die Logik zur Bearbeitung kann einfach in der Hostanwendung selbst erstellt werden.

Bei bestimmten Bedingungen wird ein Workflow jedoch vom Windows Workflow Foundation-Laufzeitmodul abgebrochen. Ein Beispiel dieser Bedingung ist ein Ergebnis des Laufzeitmoduls, für das das Beenden der Workflowinstanz fehlschlägt. Ein allgemeines Szenario im Zusammenhang mit dieser Bedingung betrifft SqlWorkflowPersistenceService. Falls ein Workflow vom Workflow-Laufzeitmodul beendet werden muss und SqlWorkflowPersistenceService aktiv ist, wird vom Laufzeitmodul versucht, den Workflowzustand beizubehalten. Falls jedoch während eines Persistenzvorgangs eine SqlException zurückgegeben wird, muss die Workflowinstanz vom Laufzeitmodul abgebrochen werden. In diesem Fall können die Ausnahmeinformationen von einem TrackingService gesichert werden, um das Szenario zu debuggen, von dem das Laufzeitmodul dazu veranlasst wurde, die Workflowinstanz abzubrechen.

Bestimmen von durch Workflows beendeten Quellen

Das WorkflowTerminated-Ereignis kann entweder programmgesteuert durch die Hostanwendung ausgelöst werden, indem eine TerminateActivity in einem Workflow verwendet wird, oder als Ergebnis einer nicht abgefangenen Ausnahme ausgelöst werden. Falls von der Hostanwendung eine bestimmte Logik ausgeführt werden muss, die auf dem Aktionstyp basiert, durch den der Workflow beendet wurde, müssen mehrere wesentliche Logikelemente überprüft werden. In folgender Tabelle sind die verschiedenen Zustände eines Workflows enthalten. Außerdem finden Sie Verweise auf Informationen bezüglich des Grunds für die Beendigung.

Aktion Workflowstatus Aktivitätsausführungsstatus Informationen zum Beenden oder Unterbrechen

Normale Ausführung

Abgeschlossen

Closed

NULL

TerminateActivity (Grund wurde angegeben und ist nicht NULL)

Terminated

Executing

Im Workflowentwurf angegebener Grund

TerminateActivity (Grund ist NULL)

Terminated

Executing

Ausnahme vom Typ Workflow beendet wurde ausgelöst

Beendet von Hostanwendung

Terminated

Executing

Im Terminate-Methodenparameter angegebener Grund

Nicht behandelte Ausnahme

Terminated

Closed

Nachricht der Ausnahme, durch die die Beendigung verursacht wurde

Nicht von Fehlerhandler behandelte Ausnahme

Terminated

Closed

Nachricht der Ausnahme, durch die die Beendigung verursacht wurde

Den Ort im Workflow, an dem eine Ausnahme zurückgegeben wurde, finden Sie im Workflowdiagramm und durch Überprüfen der Status aller Aktivitäten bei Beendigung. Im folgenden Code wird die Vorgehensweise veranschaulicht, wenn die Ausnahme von einer FaultHandlerActivity ausgelöst wird.

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

Siehe auch

Konzepte

Ausführen von Workflows
Erstellen von WorkflowRuntime

Copyright © 2007 Microsoft Corporation. Alle Rechte vorbehalten.