Partilhar via


Como: Criar um participante de acompanhamento personalizado

O acompanhamento do fluxo de trabalho fornece visibilidade sobre o status da execução do fluxo de trabalho. O tempo de execução do fluxo de trabalho emite registros de controle que descrevem eventos do ciclo de vida do fluxo de trabalho, eventos do ciclo de vida da atividade, retomadas de marcadores e falhas. Esses registros de rastreamento são consumidos pelos participantes do rastreamento. O Windows Workflow Foundation (WF) inclui um participante de rastreamento padrão que grava registros de controle como eventos ETW (Event Tracing for Windows). Se isso não atender aos seus requisitos, você também pode escrever um participante de rastreamento personalizado. Esta etapa do tutorial descreve como criar um participante de acompanhamento personalizado e um perfil de acompanhamento que capturam a saída das WriteLine atividades para que elas possam ser exibidas para o usuário.

Para criar o participante de acompanhamento personalizado

  1. Clique com o botão direito do mouse em NumberGuessWorkflowHost no Gerenciador de Soluções e escolha Adicionar, Classe. Digite StatusTrackingParticipant na caixa Nome e clique em Adicionar.

  2. Adicione as seguintes using (ou Imports) instruções na parte superior do arquivo com as outras using (ou Imports) instruções.

    Imports System.Activities.Tracking  
    Imports System.IO  
    
    using System.Activities.Tracking;  
    using System.IO;  
    
  3. Modifique a StatusTrackingParticipant classe para que ela herde do TrackingParticipant.

    Public Class StatusTrackingParticipant  
        Inherits TrackingParticipant  
    
    End Class  
    
    class StatusTrackingParticipant : TrackingParticipant  
    {  
    }  
    
  4. Adicione a seguinte Track substituição de método. Existem vários tipos diferentes de registros de rastreamento. Estamos interessados na saída de atividades, que estão contidas em registros de rastreamento de WriteLine atividades. Se o TrackingRecord for um ActivityTrackingRecord para uma WriteLine atividade, o Text de é anexado WriteLine a um arquivo com o InstanceId nome do fluxo de trabalho. Neste tutorial, o arquivo é salvo na pasta atual do aplicativo host.

    Protected Overrides Sub Track(record As TrackingRecord, timeout As TimeSpan)  
        Dim asr As ActivityStateRecord = TryCast(record, ActivityStateRecord)  
    
        If Not asr Is Nothing Then  
            If asr.State = ActivityStates.Executing And _  
            asr.Activity.TypeName = "System.Activities.Statements.WriteLine" Then  
    
                'Append the WriteLine output to the tracking  
                'file for this instance.  
                Using writer As StreamWriter = File.AppendText(record.InstanceId.ToString())  
                    writer.WriteLine(asr.Arguments("Text"))  
                    writer.Close()  
                End Using  
            End If  
        End If  
    End Sub  
    
    protected override void Track(TrackingRecord record, TimeSpan timeout)  
    {  
        ActivityStateRecord asr = record as ActivityStateRecord;  
    
        if (asr != null)  
        {  
            if (asr.State == ActivityStates.Executing &&  
                asr.Activity.TypeName == "System.Activities.Statements.WriteLine")  
            {  
                // Append the WriteLine output to the tracking  
                // file for this instance  
                using (StreamWriter writer = File.AppendText(record.InstanceId.ToString()))  
                {  
                    writer.WriteLine(asr.Arguments["Text"]);  
                    writer.Close();  
                }  
            }  
        }  
    }  
    

    Quando nenhum perfil de acompanhamento é especificado, o perfil de acompanhamento padrão é usado. Quando o perfil de acompanhamento padrão é usado, os registros de rastreamento são emitidos para todos os ActivityStates. Como só precisamos capturar o texto uma vez durante o ciclo de vida da WriteLine atividade, extraímos apenas o texto do ActivityStates.Executing estado. Em Para criar o perfil de acompanhamento e registrar o participante de acompanhamento, é criado um perfil de acompanhamento que especifica que apenas WriteLine ActivityStates.Executing os registros de acompanhamento são emitidos.

Para criar o perfil de acompanhamento e registrar o participante de rastreamento

  1. Clique com o botão direito do mouse em WorkflowHostForm no Gerenciador de Soluções e escolha Exibir Código.

  2. Adicione a seguinte using (ou Imports) instrução na parte superior do arquivo com as outras using (ou Imports) instruções.

    Imports System.Activities.Tracking  
    
    using System.Activities.Tracking;  
    
  3. Adicione o código a seguir logo ConfigureWorkflowApplication após o código que adiciona o StringWriter às extensões de fluxo de trabalho e antes dos manipuladores de ciclo de vida do fluxo de trabalho.

    'Add the custom tracking participant with a tracking profile  
    'that only emits tracking records for WriteLine activities.  
    Dim query As New ActivityStateQuery()  
    query.ActivityName = "WriteLine"  
    query.States.Add(ActivityStates.Executing)  
    query.Arguments.Add("Text")  
    
    Dim profile As New TrackingProfile()  
    profile.Queries.Add(query)  
    
    Dim stp As New StatusTrackingParticipant()  
    stp.TrackingProfile = profile  
    
    wfApp.Extensions.Add(stp)  
    
    // Add the custom tracking participant with a tracking profile  
    // that only emits tracking records for WriteLine activities.  
    StatusTrackingParticipant stp = new StatusTrackingParticipant  
    {  
        TrackingProfile = new TrackingProfile  
        {  
            Queries =
            {  
                new ActivityStateQuery  
                {  
                    ActivityName = "WriteLine",  
                    States = { ActivityStates.Executing },  
                    Arguments = { "Text" }  
                }  
            }  
        }  
    };  
    
    wfApp.Extensions.Add(stp);  
    

    Esse perfil de acompanhamento especifica que somente os registros de estado de atividade para WriteLine atividades no Executing estado são emitidos para o participante de acompanhamento personalizado.

    Depois de adicionar o código, o início do será semelhante ao exemplo a ConfigureWorkflowApplication seguir.

    Private Sub ConfigureWorkflowApplication(wfApp As WorkflowApplication)  
        'Configure the persistence store.  
        wfApp.InstanceStore = store  
    
        'Add a StringWriter to the extensions. This captures the output  
        'from the WriteLine activities so we can display it in the form.  
        Dim sw As New StringWriter()  
        wfApp.Extensions.Add(sw)  
    
        'Add the custom tracking participant with a tracking profile  
        'that only emits tracking records for WriteLine activities.  
        Dim query As New ActivityStateQuery()  
        query.ActivityName = "WriteLine"  
        query.States.Add(ActivityStates.Executing)  
        query.Arguments.Add("Text")  
    
        Dim profile As New TrackingProfile()  
        profile.Queries.Add(query)  
    
        Dim stp As New StatusTrackingParticipant()  
        stp.TrackingProfile = profile  
    
        wfApp.Extensions.Add(stp)  
    
        'Workflow lifecycle handlers...  
    
    private void ConfigureWorkflowApplication(WorkflowApplication wfApp)  
    {  
        // Configure the persistence store.  
        wfApp.InstanceStore = store;  
    
        // Add a StringWriter to the extensions. This captures the output  
        // from the WriteLine activities so we can display it in the form.  
        StringWriter sw = new StringWriter();  
        wfApp.Extensions.Add(sw);  
    
        // Add the custom tracking participant with a tracking profile  
        // that only emits tracking records for WriteLine activities.  
        StatusTrackingParticipant stp = new StatusTrackingParticipant  
        {  
            TrackingProfile = new TrackingProfile  
            {  
                Queries =
                {  
                    new ActivityStateQuery  
                    {  
                        ActivityName = "WriteLine",  
                        States = { ActivityStates.Executing },  
                        Arguments = { "Text" }  
                    }  
                }  
            }  
        };  
    
        wfApp.Extensions.Add(stp);  
    
        // Workflow lifecycle handlers...  
    

Para exibir as informações de rastreamento

  1. Clique com o botão direito do mouse em WorkflowHostForm no Gerenciador de Soluções e escolha Exibir Código.

  2. InstanceId_SelectedIndexChanged No manipulador, adicione o seguinte código imediatamente após o código que limpa a janela de status.

    'If there is tracking data for this workflow, display it  
    'in the status window.  
    If File.Exists(WorkflowInstanceId.ToString()) Then  
        Dim status As String = File.ReadAllText(WorkflowInstanceId.ToString())  
        UpdateStatus(status)  
    End If  
    
    // If there is tracking data for this workflow, display it  
    // in the status window.  
    if (File.Exists(WorkflowInstanceId.ToString()))  
    {  
        string status = File.ReadAllText(WorkflowInstanceId.ToString());  
        UpdateStatus(status);  
    }  
    

    Quando um novo fluxo de trabalho é selecionado na lista de fluxos de trabalho, os registros de controle desse fluxo de trabalho são carregados e exibidos na janela de status. O exemplo a seguir é o manipulador concluído InstanceId_SelectedIndexChanged .

    Private Sub InstanceId_SelectedIndexChanged(sender As Object, e As EventArgs) Handles InstanceId.SelectedIndexChanged  
        If InstanceId.SelectedIndex = -1 Then  
            Return  
        End If  
    
        'Clear the status window.  
        WorkflowStatus.Clear()  
    
        'If there is tracking data for this workflow, display it  
        'in the status window.  
        If File.Exists(WorkflowInstanceId.ToString()) Then  
            Dim status As String = File.ReadAllText(WorkflowInstanceId.ToString())  
            UpdateStatus(status)  
        End If  
    
        'Get the workflow version and display it.  
        'If the workflow is just starting then this info will not  
        'be available in the persistence store so do not try and retrieve it.  
        If Not WorkflowStarting Then  
            Dim instance As WorkflowApplicationInstance = _  
                WorkflowApplication.GetInstance(WorkflowInstanceId, store)  
    
            WorkflowVersion.Text = _  
                WorkflowVersionMap.GetIdentityDescription(instance.DefinitionIdentity)  
    
            'Unload the instance.  
            instance.Abandon()  
        End If  
    End Sub  
    
    private void InstanceId_SelectedIndexChanged(object sender, EventArgs e)  
    {  
        if (InstanceId.SelectedIndex == -1)  
        {  
            return;  
        }  
    
        // Clear the status window.  
        WorkflowStatus.Clear();  
    
        // If there is tracking data for this workflow, display it  
        // in the status window.  
        if (File.Exists(WorkflowInstanceId.ToString()))  
        {  
            string status = File.ReadAllText(WorkflowInstanceId.ToString());  
            UpdateStatus(status);  
        }  
    
        // Get the workflow version and display it.  
        // If the workflow is just starting then this info will not  
        // be available in the persistence store so do not try and retrieve it.  
        if (!WorkflowStarting)  
        {  
            WorkflowApplicationInstance instance =  
                WorkflowApplication.GetInstance(this.WorkflowInstanceId, store);  
    
            WorkflowVersion.Text =  
                WorkflowVersionMap.GetIdentityDescription(instance.DefinitionIdentity);  
    
            // Unload the instance.  
            instance.Abandon();  
        }  
    }  
    

Para criar e executar o aplicativo

  1. Pressione Ctrl+Shift+B para criar o aplicativo.

  2. Pressione Ctrl+F5 para iniciar o aplicativo.

  3. Selecione um intervalo para o jogo de adivinhação e o tipo de fluxo de trabalho a iniciar e clique em Novo Jogo. Insira um palpite na caixa Adivinhar e clique em Ir para enviar seu palpite. Observe que o status do fluxo de trabalho é exibido na janela de status. Esta saída é capturada das WriteLine atividades. Alterne para um fluxo de trabalho diferente selecionando um na caixa de combinação ID da instância do fluxo de trabalho e observe que o status do fluxo de trabalho atual foi removido. Volte para o fluxo de trabalho anterior e observe que o status foi restaurado, semelhante ao exemplo a seguir.

    Nota

    Se você alternar para um fluxo de trabalho que foi iniciado antes do rastreamento ser habilitado, nenhum status será exibido. No entanto, se você fizer suposições adicionais, seu status será salvo porque o rastreamento agora está habilitado.

    Please enter a number between 1 and 10
    Your guess is too high.
    Please enter a number between 1 and 10
    

    Nota

    Esta informação é útil para determinar o intervalo do número aleatório, mas não contém qualquer informação sobre o que suposições foram feitas anteriormente. Essas informações estão na próxima etapa, Como: Hospedar várias versões de um fluxo de trabalho lado a lado.

    Anote a ID da instância do fluxo de trabalho e jogue o jogo até sua conclusão.

  4. Abra o Windows Explorer e navegue até a pasta NumberGuessWorkflowHost\bin\debug (ou bin\release, dependendo das configurações do projeto). Observe que, além dos arquivos executáveis do projeto, existem arquivos com nomes de arquivos guid. Identifique aquele que corresponde ao ID da instância do fluxo de trabalho do fluxo de trabalho concluído na etapa anterior e abra-o no Bloco de Notas. As informações de rastreamento contêm informações semelhantes às seguintes.

    Please enter a number between 1 and 10
    Your guess is too high.
    Please enter a number between 1 and 10
    Your guess is too high.
    Please enter a number between 1 and 10
    

    Além da ausência de palpites do usuário, esses dados de rastreamento não contêm informações sobre a suposição final do fluxo de trabalho. Isso ocorre porque as informações de controle consistem apenas na WriteLine saída do fluxo de trabalho, e a mensagem final exibida é feita a partir do manipulador após a Completed conclusão do fluxo de trabalho. Na próxima etapa do tutorial, Como: Hospedar várias versões de um fluxo de trabalho lado a lado, as atividades existentes WriteLine são modificadas para exibir as suposições do usuário e uma atividade adicional WriteLine é adicionada que exibe os resultados finais. Depois que essas alterações forem integradas, Como: Hospedar várias versões de um fluxo de trabalho lado a lado demonstra como hospedar várias versões de um fluxo de trabalho ao mesmo tempo.