Compartir a través de


Seguimiento personalizado

El ejemplo CustomTracking muestra cómo crear un participante de seguimiento personalizado y escribir el contenido de los datos de seguimiento en la consola. Además, en el ejemplo se muestra cómo emitir CustomTrackingRecord objetos rellenados con datos definidos por el usuario. El participante de seguimiento basado en la consola filtra los TrackingRecord objetos emitidos por el flujo de trabajo mediante un perfil de seguimiento que se crea mediante código.

Detalles del ejemplo

Windows Workflow Foundation (WF) proporciona una infraestructura de seguimiento para realizar un seguimiento de la ejecución de una instancia de flujo de trabajo. El entorno de ejecución de seguimiento implementa una instancia de un flujo de trabajo para emitir eventos relacionados con el ciclo de vida del flujo de trabajo, eventos de las actividades del flujo de trabajo y eventos de seguimiento personalizados. En la tabla siguiente se detallan los componentes principales de la infraestructura de seguimiento.

Componente Descripción
Seguimiento del tiempo de ejecución Proporciona la infraestructura para emitir registros de seguimiento.
Seguimiento de participantes Consume los registros de seguimiento. .NET Framework 4 se distribuye con un participante de seguimiento que escribe los eventos de seguimiento como eventos de Seguimiento de eventos para Windows (ETW).
Perfil de seguimiento Mecanismo de filtrado que permite a un participante de seguimiento suscribirse a un subconjunto de los registros de seguimiento emitidos desde una instancia de flujo de trabajo.

En la tabla siguiente se detallan los registros de seguimiento que emite el tiempo de ejecución del flujo de trabajo.

Registro de seguimiento Descripción
Registros de seguimiento de instancias de flujo de trabajo. Describe el ciclo de vida de la instancia de flujo de trabajo. Por ejemplo, se genera un registro de instancia cuando se inicia o finaliza el flujo de trabajo.
Registros de seguimiento de estado de actividad. Detalles de la ejecución de la actividad. Estos registros indican el estado de una actividad de flujo de trabajo, como cuando se programa una actividad o cuando se completa o cuando se produce un error.
Registro de reanudación de marcadores. Se emite cada vez que se reanuda un marcador dentro de una instancia de flujo de trabajo.
Registros de seguimiento personalizados. Un autor de flujo de trabajo puede crear registros de seguimiento personalizados y emitirlos dentro de la actividad personalizada.

El participante de seguimiento se suscribe a un subconjunto de los objetos TrackingRecord emitidos utilizando perfiles de seguimiento. Un perfil de seguimiento contiene consultas de seguimiento que permiten suscribirse a un tipo de registro de seguimiento determinado. Los perfiles de seguimiento se pueden especificar en el código o en la configuración.

Participante de seguimiento personalizado

La API de participante de seguimiento permite la ampliación del tiempo de ejecución de seguimiento mediante un participante de seguimiento proporcionado por el usuario que puede incluir una lógica personalizada para controlar los objetos TrackingRecord emitidos por el tiempo de ejecución de flujo de trabajo.

Para escribir un participante de seguimiento, el usuario debe implementar TrackingParticipant. En concreto, el método Track debe ser implementado por el participante personalizado. Este método se invoca cuando el entorno de ejecución del flujo de trabajo emite un TrackingRecord.

public abstract class TrackingParticipant
{
    protected TrackingParticipant();

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

El participante de seguimiento completo se implementa en el archivo ConsoleTrackingParticipant.cs. El siguiente ejemplo de código es el método Track para el participante de seguimiento personalizado.

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();

}

En el ejemplo de código siguiente se agrega el participante de la consola al invocador de flujo de trabajo.

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

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

Emisión de registros de seguimiento personalizados

En este ejemplo también se muestra la capacidad de emitir CustomTrackingRecord objetos a partir de una actividad de flujo de trabajo personalizada:

En el ejemplo siguiente se muestra cómo emitir CustomTrackingRecord objetos dentro de una actividad personalizada.

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

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

Para utilizar este ejemplo

  1. Con Visual Studio, abra el archivo de solución CustomTrackingSample.sln.

  2. Para compilar la solución, presione Ctrl+MAYÚS+B.

  3. Para ejecutar la solución, presione CTRL+F5.

Consulte también