Condividi tramite


Rilevamento personalizzato

L'esempio CustomTracking illustra come creare un partecipante del rilevamento personalizzato e scrivere il contenuto dei dati di rilevamento nella console. Inoltre, l'esempio illustra come generare CustomTrackingRecord oggetti popolati con dati definiti dall'utente. Il partecipante di tracciamento basato su console filtra gli oggetti TrackingRecord emessi dal flusso di lavoro utilizzando un oggetto profilo di tracciamento creato nel codice.

Dettagli di esempio

Windows Workflow Foundation (WF) fornisce un'infrastruttura di rilevamento per tenere traccia dell'esecuzione di un'istanza del flusso di lavoro. Il runtime di tracciamento implementa un'istanza del flusso di lavoro per emettere eventi correlati al ciclo di vita del flusso di lavoro, eventi dalle attività del flusso di lavoro e eventi di tracciamento personalizzati. La tabella seguente illustra in dettaglio i componenti principali dell'infrastruttura di rilevamento.

Componente Descrizione
Durata di monitoraggio Fornisce l'infrastruttura per generare record di rilevamento.
Monitoraggio dei partecipanti Consuma i record di tracciamento. .NET Framework 4 viene fornito con un partecipante di rilevamento che scrive i record di rilevamento come eventi ETW (Event Tracing for Windows).
Profilo di tracciamento Meccanismo di filtro che consente a un partecipante al monitoraggio di iscriversi a un insieme parziale dei record di monitoraggio generati da un'istanza del flusso di lavoro.

La tabella seguente illustra in dettaglio i record di rilevamento generati dal runtime del flusso di lavoro.

Registro di Tracciamento Descrizione
Registri di tracciamento dell'istanza del flusso di lavoro. Descrive il ciclo di vita dell'istanza del flusso di lavoro. Ad esempio, un record di istanza viene generato all'avvio o al completamento del flusso di lavoro.
Registri di tracciamento dello stato dell'attività. Dettagli dell'esecuzione dell'attività. Questi record indicano lo stato di un'attività del flusso di lavoro, ad esempio quando un'attività è pianificata o quando l'attività viene completata o quando viene generato un errore.
Record di ripresa del segnalibro. Generato ogni volta che viene ripreso un segnalibro all'interno di un'istanza del flusso di lavoro.
Record di rilevamento personalizzati. Un autore del flusso di lavoro può creare record di rilevamento personalizzati e generarli all'interno dell'attività personalizzata.

Il partecipante del rilevamento si iscrive a un sottoinsieme degli oggetti emessi TrackingRecord tramite profili di rilevamento. Un profilo di monitoraggio contiene query che permettono di abbonarsi a un particolare tipo di record di tracciamento. I profili di rilevamento possono essere specificati nel codice o nella configurazione.

Partecipante del monitoraggio personalizzato

L'API partecipante di tracking consente di estendere il runtime di rilevamento con un partecipante di tracking fornito dall'utente che può includere logica personalizzata per gestire gli oggetti TrackingRecord emessi dal runtime del flusso di lavoro.

Per registrare un partecipante di monitoraggio, l'utente deve implementare TrackingParticipant. In particolare, il Track metodo deve essere implementato dal partecipante personalizzato. Questo metodo viene chiamato quando un TrackingRecord viene emesso dal runtime del flusso di lavoro.

public abstract class TrackingParticipant
{
    protected TrackingParticipant();

    public virtual TrackingProfile TrackingProfile { get; set; }
    public abstract void Track(TrackingRecord record, TimeSpan timeout);
}

Il partecipante di rilevamento completo viene implementato nel file ConsoleTrackingParticipant.cs. L'esempio di codice seguente è il metodo Track per il partecipante personalizzato di rilevamento.

protected override void Track(TrackingRecord record, TimeSpan timeout)
{
    ...
    WorkflowInstanceRecord workflowInstanceRecord = record as WorkflowInstanceRecord;
    if (workflowInstanceRecord != null)
    {
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " Workflow InstanceID: {0} Workflow instance state: {1}",
            record.InstanceId, workflowInstanceRecord.State));
    }

    ActivityStateRecord activityStateRecord = record as ActivityStateRecord;
    if (activityStateRecord != null)
    {
        IDictionary<String, object> variables = activityStateRecord.Variables;
        StringBuilder vars = new StringBuilder();

        if (variables.Count > 0)
        {
            vars.AppendLine("\n\tVariables:");
            foreach (KeyValuePair<string, object> variable in variables)
            {
                vars.AppendLine(String.Format(
                    "\t\tName: {0} Value: {1}", variable.Key, variable.Value));
            }
        }
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}",
                activityStateRecord.Activity.Name, activityStateRecord.State,
            ((variables.Count > 0) ? vars.ToString() : String.Empty)));
    }

    CustomTrackingRecord customTrackingRecord = record as CustomTrackingRecord;

    if ((customTrackingRecord != null) && (customTrackingRecord.Data.Count > 0))
    {
        ...
    }
    Console.WriteLine();

}

Nell'esempio di codice seguente viene aggiunto il partecipante della console all'invoker del flusso di lavoro.

ConsoleTrackingParticipant customTrackingParticipant = new ConsoleTrackingParticipant()
{
    ...
    // The tracking profile is set here, refer to Program.CS
...
}

WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow());
invoker.Extensions.Add(customTrackingParticipant);

Emissione di record di tracciamento personalizzati

Questo esempio illustra anche la possibilità di generare CustomTrackingRecord oggetti da un'attività del flusso di lavoro personalizzata:

Nell'esempio seguente viene illustrato come emettere oggetti CustomTrackingRecord in un'attività personalizzata.

// Create the Custom Tracking Record
CustomTrackingRecord customRecord = new CustomTrackingRecord("OrderIn")
{
    Data =
    {
        {"OrderId", 200},
        {"OrderDate", "20 Aug 2001"}
    }
};

// Emit custom tracking record
context.Track(customRecord);

Per usare questo esempio

  1. Usando Visual Studio, aprire il file della soluzione CustomTrackingSample.sln.

  2. Per compilare la soluzione, premere CTRL+MAIUSC+B.

  3. Per eseguire la soluzione, premere CTRL+F5.

Vedere anche