Procédure : créer un participant de suivi de personnalisé
Le suivi de workflow offre une visibilité dans l'état d'exécution de workflow. L'exécution de workflow émet des enregistrements de suivi qui décrivent les événements de cycle de vie du workflow, les événements de cycle de vie de l'activité, la reprise de signet et les erreurs. Ces enregistrements de suivi sont consommés par les participants de suivi. Windows Workflow Foundation (WF) inclut un participant de trace standard qui écrit des enregistrements de suivi en tant qu’événements de suivi d’événements pour Windows (ETW). Si cela ne répond pas à vos besoins, vous pouvez également écrire un participant de suivi personnalisé. Cette étape du didacticiel décrit comment créer un participant de suivi et un modèle de suivi qui capturent la sortie des activités de WriteLine
afin qu'elles puissent être affichées à l'utilisateur.
Pour créer le participant de suivi personnalisé
Dans l’Explorateur de solutions, cliquez avec le bouton droit sur NumberGuessWorkflowHost, puis sélectionnez Ajouter, Classe. Entrez
StatusTrackingParticipant
dans la zone Nom, puis cliquez sur Ajouter.Ajoutez les instructions
using
(ouImports
) suivantes au début du fichier avec les autres instructionsusing
(ouImports
).Imports System.Activities.Tracking Imports System.IO
using System.Activities.Tracking; using System.IO;
Modifiez la classe
StatusTrackingParticipant
afin qu'elle hérite deTrackingParticipant
.Public Class StatusTrackingParticipant Inherits TrackingParticipant End Class
class StatusTrackingParticipant : TrackingParticipant { }
Ajoutez la substitution de méthode
Track
suivante. Il existe plusieurs types différents d'enregistrements de suivi. Nous sommes intéressés par la sortie des activitésWriteLine
, qui sont contenues dans les enregistrements de suivi d'activité. SiTrackingRecord
est unActivityTrackingRecord
d'une activitéWriteLine
, la propriétéText
de l'activitéWriteLine
est ajoutée à un fichier nommé après leInstanceId
du workflow. Dans ce didacticiel, le fichier est enregistré dans le dossier actif de l’application hôte.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(); } } } }
Si aucun modèle de suivi n'est spécifié, le modèle de suivi par défaut est utilisé. Lorsque le modèle de suivi par défaut est utilisé, les enregistrements de suivi sont émis pour tous les
ActivityStates
. Étant donné que nous devons uniquement capturer le texte une seule fois pendant le cycle de vie de l'activitéWriteLine
, nous extrayons uniquement le texte de l'étatActivityStates.Executing
. Dans Pour créer le modèle de suivi et enregistrer un participant de suivi, un modèle de suivi est créé spécifiant que seuls les enregistrements de suiviWriteLine
ActivityStates.Executing
sont émis.
Pour créer le modèle de suivi et inscrire le participant de suivi
Cliquez avec le bouton droit sur WorkflowHostForm dans l’Explorateur de solutions et sélectionnez Afficher le code.
Ajoutez l'instruction
using
(ouImports
) suivante au début du fichier avec les autres instructionsusing
(ouImports
).Imports System.Activities.Tracking
using System.Activities.Tracking;
Ajoutez le code suivant à
ConfigureWorkflowApplication
juste après le code qui ajouteStringWriter
aux extensions de workflow et avant les gestionnaires de cycle de vie de workflow.'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);
Ce modèle de suivi spécifie que seuls les enregistrements d'état d'activité des activités
WriteLine
dans l'étatExecuting
sont émis au participant de suivi personnalisé.Après avoir ajouté le code, le début de
ConfigureWorkflowApplication
sera semblable à l'exemple ci-dessous.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...
Pour afficher les informations de suivi
Cliquez avec le bouton droit sur WorkflowHostForm dans l’Explorateur de solutions et sélectionnez Afficher le code.
Dans le gestionnaire
InstanceId_SelectedIndexChanged
, ajoutez le code suivant immédiatement après le code qui supprime la fenêtre d'état.'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); }
Lorsqu'un nouveau workflow est sélectionné dans la liste de workflow, les enregistrements de suivi pour ce workflow sont chargés et affichés dans la fenêtre d'état. Cet exemple est le gestionnaire
InstanceId_SelectedIndexChanged
terminé.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(); } }
Pour générer et exécuter l'application
Appuyez sur Ctrl+Maj+B pour générer l'application.
Appuyez sur Ctrl+F5 pour démarrer l'application.
Sélectionnez une plage pour le jeu de devinettes et le type de workflow à démarrer, puis cliquez sur Nouvelle partie. Entrez une proposition dans la zone Deviner et cliquez sur Aller à pour soumettre votre proposition. Notez que l'état du workflow est affiché dans la fenêtre d'état. Cette sortie est capturée à partir des activités
WriteLine
. Basculez vers un workflow différent en sélectionnant un dans la zone de liste déroulante ID de l’instance de workflow et notez que l’état du workflow est supprimé. Revenez au workflow précédent et notez que le mode est restauré, semblable à l'exemple suivant.Notes
Si vous basculez vers un workflow démarré avant activation du suivi, aucun état ne s'affiche. Mais si vous effectuez des propositions supplémentaires, leur état est enregistré, car le suivi est maintenant activé.
Please enter a number between 1 and 10 Your guess is too high. Please enter a number between 1 and 10
Notes
Ces informations sont utiles pour déterminer la plage de nombres aléatoires, mais elles ne contiennent aucune information sur les propositions précédemment effectuées. Ces informations se trouvent à l’étape suivante : Procédure : Héberger plusieurs versions d’un workflow côte à côte.
Notez l'ID d'instance de workflow, et exécutez le jeu jusqu'à son achèvement.
Ouvrez l’Explorateur Windows et accédez au dossier NumberGuessWorkflowHost\bin\debug (ou bin\release selon les paramètres du projet). Notez qu'en plus des fichiers exécutables du projet, il existe des fichiers avec les noms de fichiers GUID. Identifiez celui qui correspond à l'identificateur d'instance du workflow effectué à l'étape précédente et ouvrez-le dans le Bloc-notes. Les informations de suivi contiennent des informations semblables à celles qui suivent.
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
Outre l'absence de propositions de l'utilisateur, les données de suivi ne contiennent pas d'informations sur la proposition finale du workflow. C'est parce que les informations de suivi contiennent uniquement la sortie
WriteLine
du workflow, et le dernier message qui s'affiche est généré à partir du gestionnaireCompleted
après que le workflow est terminé. Dans l’étape suivante du didacticiel, Procédure : Héberger plusieurs versions d’un workflow côte à côte, les activitésWriteLine
existantes sont modifiées pour afficher les propositions de l’utilisateur, et une activitéWriteLine
supplémentaire est ajoutée et affiche les résultats finaux. Une fois ces modifications intégrées, Procédure : Héberger plusieurs versions d’un workflow côte à côte montre comment héberger plusieurs versions d’un workflow en même temps.