Condividi tramite


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

ServicesExceptionNotHandled

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

WorkflowAborted

Generato quando un flusso di lavoro viene interrotto durante l'elaborazione.

WorkflowCompleted

Generato quando il flusso di lavoro ha completato l'elaborazione.

WorkflowCreated

Generato quando viene creata un'istanza di un flusso di lavoro.

WorkflowIdled

Generato quando un flusso di lavoro entra nello stato inattivo.

WorkflowLoaded

Generato quando un flusso di lavoro viene ricreato da un supporto di archiviazione.

WorkflowPersisted

Generato quando lo stato corrente del flusso di lavoro viene salvato in modo permanente in un supporto di archiviazione.

WorkflowResumed

Generato quando un flusso di lavoro riprende l'esecuzione dopo essere stato interrotto o scaricato.

WorkflowStarted

Generato quando un flusso di lavoro avvia l'esecuzione.

WorkflowSuspended

Generato quando un flusso di lavoro entra nello stato di sospensione.

WorkflowTerminated

Generato quando un flusso di lavoro viene terminato.

WorkflowUnloaded

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.