Dela via


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

  1. Högerklicka på NumberGuessWorkflowHost i Istraživač rešenja och välj Lägg till, Klass. Skriv StatusTrackingParticipant i rutan Namn och klicka på Lägg till.

  2. Lägg till följande using (eller Imports) -instruktioner överst i filen med de andra using (eller Imports) -uttrycken.

    Imports System.Activities.Tracking  
    Imports System.IO  
    
    using System.Activities.Tracking;  
    using System.IO;  
    
  3. Ändra klassen så att den StatusTrackingParticipant ärver från TrackingParticipant.

    Public Class StatusTrackingParticipant  
        Inherits TrackingParticipant  
    
    End Class  
    
    class StatusTrackingParticipant : TrackingParticipant  
    {  
    }  
    
  4. Lägg till följande Track åsidosättning av metoden. Det finns flera olika typer av spårningsposter. Vi är intresserade av WriteLine utdata från aktiviteter som finns i aktivitetsspårningsposter. TrackingRecord Om är en ActivityTrackingRecord för en WriteLine aktivitet Text läggs till i WriteLine en fil med namnet efter InstanceId 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 aktivitetens WriteLine livscykel extraherar vi bara texten från tillståndet ActivityStates.Executing . I Skapa spårningsprofilen och registrera spårningsdeltagaren skapas en spårningsprofil som anger att endast WriteLine ActivityStates.Executing spårningsposter genereras.

Skapa spårningsprofilen och registrera spårningsdeltagaren

  1. Högerklicka på WorkflowHostForm i Istraživač rešenja och välj Visa kod.

  2. Lägg till följande using (eller Imports) -instruktion överst i filen med de andra using (eller Imports) -uttrycken.

    Imports System.Activities.Tracking  
    
    using System.Activities.Tracking;  
    
  3. Lägg till följande kod till ConfigureWorkflowApplication strax efter koden som lägger StringWriter 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 i Executing 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

  1. Högerklicka på WorkflowHostForm i Istraživač rešenja och välj Visa kod.

  2. 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

  1. Tryck på Ctrl+Skift+B för att skapa programmet.

  2. Starta programmet genom att trycka på Ctrl+F5.

  3. 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å 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.

  4. Ö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ån Completed 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 befintliga WriteLine aktiviteterna för att visa användarens gissningar och ytterligare WriteLine 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.