Gör så här: Skapa en anpassad spårningsdeltagare
Arbetsflödesspårning ger insyn i status för arbetsflödeskörning. Arbetsflödeskörningen genererar spårningsposter som beskriver händelser i arbetsflödets livscykel, händelser i aktivitetslivscykeln, återtagning av bokmärken och fel. Dessa spårningsposter används av spårningsdeltagare. Windows Workflow Foundation (WF) innehåller en standardspårningsdeltagare som skriver spårningsposter som händelsespårning för Windows-händelser (ETW). Om det inte uppfyller dina krav kan du också skriva en anpassad spårningsdeltagare. Det här självstudiesteget beskriver hur du skapar en anpassad spårningsdeltagare och spårningsprofil som samlar in utdata WriteLine
från aktiviteter så att de kan visas för användaren.
Så här skapar du den anpassade spårningsdeltagaren
Högerklicka på NumberGuessWorkflowHost i Solution Explorer och välj Lägg till, klass. Skriv
StatusTrackingParticipant
i rutan Namn och klicka på Lägg till.Lägg till följande
using
(ellerImports
) -instruktioner överst i filen med de andrausing
(ellerImports
) -uttrycken.Imports System.Activities.Tracking Imports System.IO
using System.Activities.Tracking; using System.IO;
Ändra klassen så att den
StatusTrackingParticipant
ärver frånTrackingParticipant
.Public Class StatusTrackingParticipant Inherits TrackingParticipant End Class
class StatusTrackingParticipant : TrackingParticipant { }
Lägg till följande
Track
åsidosättning av metoden. Det finns flera olika typer av spårningsposter. Vi är intresserade avWriteLine
utdata från aktiviteter som finns i aktivitetsspårningsposter.TrackingRecord
Om är enActivityTrackingRecord
för enWriteLine
aktivitetText
läggs till iWriteLine
en fil med namnet efterInstanceId
arbetsflödet. I den här självstudien sparas filen i den aktuella mappen för värdprogrammet.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(); } } } }
När ingen spårningsprofil har angetts används standardspårningsprofilen. När standardspårningsprofilen används genereras spårningsposter för alla
ActivityStates
. Eftersom vi bara behöver samla in texten en gång under aktivitetensWriteLine
livscykel extraherar vi bara texten från tillståndetActivityStates.Executing
. I Skapa spårningsprofilen och registrera spårningsdeltagaren skapas en spårningsprofil som anger att endastWriteLine
ActivityStates.Executing
spårningsposter genereras.
Skapa spårningsprofilen och registrera spårningsdeltagaren
Högerklicka på WorkflowHostForm i Solution Explorer och välj Visa kod.
Lägg till följande
using
(ellerImports
) -instruktion överst i filen med de andrausing
(ellerImports
) -uttrycken.Imports System.Activities.Tracking
using System.Activities.Tracking;
Lägg till följande kod till
ConfigureWorkflowApplication
strax efter koden som läggerStringWriter
till i arbetsflödestilläggen och före arbetsflödets livscykelhanterare.'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);
Den här spårningsprofilen anger att endast aktivitetstillståndsposter för
WriteLine
aktiviteter iExecuting
tillståndet skickas till den anpassade spårningsdeltagaren.När du har lagt till koden ser början av
ConfigureWorkflowApplication
ut som i följande exempel.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...
Så här visar du spårningsinformationen
Högerklicka på WorkflowHostForm i Solution Explorer och välj Visa kod.
InstanceId_SelectedIndexChanged
I hanteraren lägger du till följande kod omedelbart efter koden som rensar statusfönstret.'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); }
När ett nytt arbetsflöde har valts i arbetsflödeslistan läses spårningsposterna för arbetsflödet in och visas i statusfönstret. Följande exempel är den slutförda
InstanceId_SelectedIndexChanged
hanteraren.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(); } }
Skapa och köra programmet
Tryck på Ctrl+Skift+B för att skapa programmet.
Starta programmet genom att trycka på Ctrl+F5.
Välj ett intervall för gissningsspelet och vilken typ av arbetsflöde som ska startas och klicka på Nytt spel. Ange en gissning i rutan Gissa och klicka på Gå för att skicka din gissning. Observera att status för arbetsflödet visas i statusfönstret. Utdata hämtas från aktiviteterna
WriteLine
. Växla till ett annat arbetsflöde genom att välja ett i kombinationsrutan Arbetsflödesinstans-ID och observera att statusen för det aktuella arbetsflödet tas bort. Växla tillbaka till föregående arbetsflöde och observera att statusen återställs, ungefär som i följande exempel.Kommentar
Om du växlar till ett arbetsflöde som startades innan spårning aktiverades visas ingen status. Men om du gör ytterligare gissningar sparas deras status eftersom spårning nu är aktiverat.
Please enter a number between 1 and 10 Your guess is too high. Please enter a number between 1 and 10
Kommentar
Den här informationen är användbar för att fastställa intervallet för det slumpmässiga talet, men den innehåller ingen information om vilka gissningar som har gjorts tidigare. Den här informationen finns i nästa steg, Så här gör du: Värd för flera versioner av ett arbetsflöde sida vid sida.
Anteckna arbetsflödesinstans-ID:t och spela spelet tills det har slutförts.
Öppna Utforskaren och gå till mappen NumberGuessWorkflowHost\bin\debug (eller bin\release beroende på projektinställningarna). Observera att förutom projektets körbara filer finns det filer med guid-filnamn. Identifiera den som motsvarar arbetsflödesinstans-ID:t från det slutförda arbetsflödet i föregående steg och öppna det i Anteckningar. Spårningsinformationen innehåller information som liknar följande.
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
Förutom avsaknaden av användarens gissningar innehåller dessa spårningsdata inte information om den slutliga gissningen av arbetsflödet. Det beror på att spårningsinformationen endast består av
WriteLine
utdata från arbetsflödet, och det slutliga meddelandet som visas görs frånCompleted
hanteraren när arbetsflödet har slutförts. I nästa steg i självstudien How to: Host Multiple Versions of a Workflow Side-by-Side ändras de befintligaWriteLine
aktiviteterna för att visa användarens gissningar och ytterligareWriteLine
en aktivitet läggs till som visar de slutliga resultaten. När dessa ändringar har integrerats visar How to: Host Multiple Versions of a Workflow Side-by-Side hur du är värd för flera versioner av ett arbetsflöde samtidigt.