Partilhar via


Rastreamento personalizado

O exemplo CustomTracking demonstra como criar um participante de acompanhamento personalizado e gravar o conteúdo dos dados de rastreamento no console. Além disso, o exemplo demonstra como emitir CustomTrackingRecord objetos preenchidos com dados definidos pelo usuário. O participante de rastreamento baseado em console filtra os TrackingRecord objetos emitidos pelo fluxo de trabalho usando um objeto de perfil de acompanhamento criado no código.

Detalhes da amostra

O Windows Workflow Foundation (WF) fornece uma infraestrutura de rastreamento para controlar a execução de uma instância de fluxo de trabalho. O tempo de execução de rastreamento implementa uma instância de fluxo de trabalho para emitir eventos relacionados ao ciclo de vida do fluxo de trabalho, eventos de atividades de fluxo de trabalho e eventos de controle personalizados. A tabela a seguir detalha os principais componentes da infraestrutura de rastreamento.

Componente Description
Rastreando o tempo de execução Fornece a infraestrutura para emitir registros de rastreamento.
Acompanhamento de participantes Consome os registros de rastreamento. O .NET Framework 4 é fornecido com um participante de controle que grava registros de controle como eventos ETW (Rastreamento de Eventos para Windows).
Perfil de rastreamento Um mecanismo de filtragem que permite que um participante de rastreamento se inscreva em um subconjunto dos registros de rastreamento emitidos por uma instância de fluxo de trabalho.

A tabela a seguir detalha os registros de controle que o tempo de execução do fluxo de trabalho emite.

Registro de rastreamento Description
Registros de controle de instância de fluxo de trabalho. Descreve o ciclo de vida da instância do fluxo de trabalho. Por exemplo, um registro de instância é emitido quando o fluxo de trabalho é iniciado ou concluído.
Registros de rastreamento do estado da atividade. Detalha a execução da atividade. Esses registros indicam o estado de uma atividade de fluxo de trabalho, como quando uma atividade é agendada, quando a atividade é concluída ou quando uma falha é lançada.
Registro de retomada do favorito. Emitido sempre que um marcador dentro de uma instância de fluxo de trabalho é retomado.
Registros de rastreamento personalizados. Um autor de fluxo de trabalho pode criar Registros de Controle Personalizados e emiti-los dentro da atividade personalizada.

O participante de rastreamento se inscreve para um subconjunto dos objetos emitidos TrackingRecord usando perfis de rastreamento. Um perfil de acompanhamento contém consultas de acompanhamento que permitem a subscrição de um determinado tipo de registo de acompanhamento. Os perfis de rastreamento podem ser especificados no código ou na configuração.

Participante de Acompanhamento Personalizado

A API do participante de rastreamento permite a extensão do tempo de execução do rastreamento com um participante de rastreamento fornecido pelo usuário que pode incluir lógica personalizada para lidar com TrackingRecord objetos emitidos pelo tempo de execução do fluxo de trabalho.

Para escrever um participante de acompanhamento, o usuário deve implementar TrackingParticipanto . Especificamente, o Track método deve ser implementado pelo participante personalizado. Esse método é chamado quando um TrackingRecord é emitido pelo tempo de execução do fluxo de trabalho.

public abstract class TrackingParticipant
{
    protected TrackingParticipant();

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

O participante de rastreamento completo é implementado no arquivo ConsoleTrackingParticipant.cs. O exemplo de código a seguir é o Track método para o participante de rastreamento 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();

}

O exemplo de código a seguir adiciona o participante do console ao invocador de fluxo de trabalho.

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

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

Emissão de registros de rastreamento personalizados

Este exemplo também demonstra a capacidade de emitir CustomTrackingRecord objetos de uma atividade de fluxo de trabalho personalizada:

O exemplo a seguir demonstra como emitir CustomTrackingRecord objetos dentro de uma atividade 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 usar este exemplo

  1. Usando o Visual Studio, abra o arquivo de solução CustomTrackingSample.sln.

  2. Para criar a solução, pressione CTRL+SHIFT+B.

  3. Para executar a solução, pressione CTRL+F5.

Consulte também