Elaborazione di eventi di WorkflowRuntime
Il motore di runtime del flusso di lavoro di Windows Workflow genera molti eventi nel corso della sua attività che l'applicazione host è in grado di gestire. Si tratta di eventi che inviano notifica all'applicazione quando il motore di runtime è Started o Stopped, oltre a molti eventi corrispondenti alla durata di ogni istanza del flusso di lavoro in esecuzione. La procedura per creare gestori di tali eventi è analoga al modello di gestione degli eventi fornito in .NET Framework. Ad esempio, nel codice seguente viene creato un gestore eventi per l'evento Started generato dal runtime del flusso di lavoro quando inizia l'esecuzione.
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");
};
Nell'elenco di seguito vengono elencati gli eventi che possono essere generati dal motore di runtime di Windows Workflow appartenenti allo stesso motore di runtime del flusso di lavoro.
Evento | Descrizione |
---|---|
Generato quando un servizio derivato dalla classe astratta WorkflowRuntimeService chiama il metodo RaiseServicesExceptionNotHandledEvent poiché si verifica un'eccezione durante l'esecuzione del flusso di lavoro che il servizio non è in grado di gestire. |
|
Started |
Generato quando il motore di runtime del flusso di lavoro avvia l'esecuzione. |
Stopped |
Generato quando il motore di runtime del flusso di lavoro interrompe l'esecuzione. |
Nell'elenco di seguito vengono elencati gli eventi dell'istanza del flusso di lavoro che possono essere generati dal motore di runtime del flusso di lavoro.
Evento | Descrizione | ||
---|---|---|---|
Generato quando un flusso di lavoro viene interrotto durante l'elaborazione. | |||
Generato quando il flusso di lavoro ha completato l'elaborazione. | |||
Generato quando viene creata un'istanza di un flusso di lavoro. | |||
Generato quando un flusso di lavoro entra nello stato inattivo. | |||
Generato quando un flusso di lavoro viene ricreato da un supporto di archiviazione. | |||
Generato quando lo stato corrente del flusso di lavoro viene salvato in modo permanente in un supporto di archiviazione. | |||
Generato quando un flusso di lavoro riprende l'esecuzione dopo essere stato interrotto o scaricato. | |||
Generato quando un flusso di lavoro avvia l'esecuzione. | |||
Generato quando un flusso di lavoro entra nello stato di sospensione. | |||
Generato quando un flusso di lavoro viene terminato. | |||
Generato quando un flusso di lavoro viene scaricato. |
Condizioni di interruzione di un flusso di lavoro
Possono verificarsi diverse condizioni durante l'esecuzione di un flusso di lavoro che possono generare l'evento WorkflowAborted. Ad esempio, un'applicazione host può intervenire nel processo chiamando il metodo Abort da un oggetto WorkflowInstance. In questo caso, la causa è conosciuta e la logica di gestione può essere creata senza eccessive difficoltà nella stessa applicazione host.
Esistono tuttavia condizioni in cui il motore di runtime di Windows Workflow Foundation interromperà un flusso di lavoro. Un esempio di una simile condizione è costituito dal risultato del motore di runtime che non riesce a terminare un'istanza del flusso di lavoro. Uno scenario comune riferito a questa condizione riguarda SqlWorkflowPersistenceService. Se il motore di runtime del flusso di lavoro deve terminare un flusso di lavoro e SqlWorkflowPersistenceService è attivo, il motore di runtime tenterà di rendere persistente lo stato del flusso di lavoro. Tuttavia, se viene generata un'eccezione SqlException durante l'operazione di persistenza, il motore di runtime dovrà interrompere l'istanza del flusso di lavoro. In tal caso, è possibile utilizzare un TrackingService per eseguire il dump delle informazioni sull'eccezione per eseguire il debug dello scenario che ha causato l'interruzione dell'istanza del flusso di lavoro da parte del motore di runtime.
Determinazione dell'origine dell'interruzione del flusso di lavoro
L'evento WorkflowTerminated può essere generato a livello di codice tramite l'applicazione host utilizzando un'attività TerminateActivity in un flusso di lavoro oppure come risultato di un'eccezione non intercettata. Se l'applicazione host deve eseguire una certa logica basata sul tipo di azione che ha causato l'interruzione del flusso di lavoro, ci sono diversi elementi chiave della logica implementata che sarà necessario controllare. Nella tabella seguente sono mostrati diversi stati di un flusso di lavoro e dove cercare informazioni relative alle cause dell'interruzione.
Azione | Stato del flusso di lavoro | Stato di esecuzione dell'attività | Informazioni di interruzione o sospensione |
---|---|---|---|
Esecuzione normale |
Completato |
Chiuso |
NULL |
TerminateActivity (causa specifica e non NULL) |
Interrotto |
Esecuzione in corso |
Causa specificata in progettazione del flusso di lavoro |
TerminateActivity (la causa è NULL) |
Terminated |
Executing |
È stata generata un'eccezione di tipo flusso di lavoro interrotto |
Interrotto dall 'applicazione host |
Terminated |
Executing |
Causa specificata nel parametro del metodo di interruzione |
Eccezione non gestita |
Terminated |
Closed |
Messaggio dell'eccezione che ha causato l'interruzione. |
Eccezione non gestita nel gestore errori |
Terminated |
Closed |
Messaggio dell'eccezione che ha causato l'interruzione. |
Il punto nel flusso di lavoro in cui è stata generata un'eccezione può essere trovato analizzando il grafico del flusso di lavoro e controllando lo stato di ogni attività al momento dell'interruzione. Nel codice seguente viene illustrato come portare a termine questa operazione se l'eccezione è generata da un'attività 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;
}
Vedere anche
Concetti
Esecuzione dei flussi di lavoro
Creazione della classe WorkflowRuntime
Copyright © 2007 Microsoft Corporation. Tutti i diritti riservati.