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 |
---|---|
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 | ||
---|---|---|---|
Wird ausgelöst, wenn ein Workflow während der Verarbeitung angehalten wird. | |||
Wird ausgelöst, wenn die Verarbeitung eines Workflows Verarbeiten abgeschlossen ist. | |||
Wird ausgelöst, wenn ein Workflow instanziiert wird. | |||
Wird ausgelöst, wenn ein Workflow in den Leerlauf wechselt. | |||
Wird ausgelöst, wenn ein Workflow von einem Speichermedium aus neu erstellt wird. | |||
Wird ausgelöst, wenn der aktuelle Zustand des Workflows in einem Speichermedium beibehalten wird. | |||
Wird ausgelöst, wenn die Ausführung eines Workflows fortgesetzt wird, nachdem sie angehalten oder entladen wurde. | |||
Wird zu Beginn der Ausführung eines Workflows ausgelöst. | |||
Wird ausgelöst, wenn ein Workflow in den unterbrochenen Zustand wechselt. | |||
Wird ausgelöst, wenn ein Workflow beendet wird. | |||
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.