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
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.Adicione as seguintes
using
(ouImports
) instruções na parte superior do arquivo com as outrasusing
(ouImports
) instruções.Imports System.Activities.Tracking Imports System.IO
using System.Activities.Tracking; using System.IO;
Modifique a
StatusTrackingParticipant
classe para que ela herde doTrackingParticipant
.Public Class StatusTrackingParticipant Inherits TrackingParticipant End Class
class StatusTrackingParticipant : TrackingParticipant { }
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 deWriteLine
atividades. Se oTrackingRecord
for umActivityTrackingRecord
para umaWriteLine
atividade, oText
de é anexadoWriteLine
a um arquivo com oInstanceId
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 daWriteLine
atividade, extraímos apenas o texto doActivityStates.Executing
estado. Em Para criar o perfil de acompanhamento e registrar o participante de acompanhamento, é criado um perfil de acompanhamento que especifica que apenasWriteLine
ActivityStates.Executing
os registros de acompanhamento são emitidos.
Para criar o perfil de acompanhamento e registrar o participante de rastreamento
Clique com o botão direito do mouse em WorkflowHostForm no Gerenciador de Soluções e escolha Exibir Código.
Adicione a seguinte
using
(ouImports
) instrução na parte superior do arquivo com as outrasusing
(ouImports
) instruções.Imports System.Activities.Tracking
using System.Activities.Tracking;
Adicione o código a seguir logo
ConfigureWorkflowApplication
após o código que adiciona oStringWriter
à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 noExecuting
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
Clique com o botão direito do mouse em WorkflowHostForm no Gerenciador de Soluções e escolha Exibir Código.
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
Pressione Ctrl+Shift+B para criar o aplicativo.
Pressione Ctrl+F5 para iniciar o aplicativo.
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.
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 aCompleted
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 existentesWriteLine
são modificadas para exibir as suposições do usuário e uma atividade adicionalWriteLine
é 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.