Delen via


Procedure: Een aangepaste traceringsdeelnemer maken

Werkstroomtracking biedt inzicht in de status van de uitvoering van de werkstroom. De werkstroomruntime verzendt traceringsrecords die levenscyclus-gebeurtenissen van de werkstroom beschrijven, gebeurtenissen voor de levenscyclus van activiteiten, bladwijzers en fouten. Deze traceringsrecords worden gebruikt door deelnemers bij te houden. Windows Workflow Foundation (WF) bevat een standaardtraceringsdeelnemer die traceringsrecords schrijft als ETW-gebeurtenissen (Event Tracing for Windows). Als dat niet aan uw vereisten voldoet, kunt u ook een aangepaste deelnemer schrijven. In deze zelfstudie wordt beschreven hoe u een aangepast traceringsprofiel voor deelnemers en traceringsprofiel maakt waarmee de uitvoer van WriteLine activiteiten wordt vastgelegd, zodat deze aan de gebruiker kunnen worden weergegeven.

De aangepaste traceringsdeelnemer maken

  1. Klik met de rechtermuisknop op NumberGuessWorkflowHost in Solution Explorer en kies Toevoegen, Klasse. Typ StatusTrackingParticipant in het vak Naam en klik op Toevoegen.

  2. Voeg de volgende using (of Imports) instructies toe boven aan het bestand met de andere using (of Imports) instructies.

    Imports System.Activities.Tracking  
    Imports System.IO  
    
    using System.Activities.Tracking;  
    using System.IO;  
    
  3. Wijzig de StatusTrackingParticipant klasse zodat deze wordt overgenomen van TrackingParticipant.

    Public Class StatusTrackingParticipant  
        Inherits TrackingParticipant  
    
    End Class  
    
    class StatusTrackingParticipant : TrackingParticipant  
    {  
    }  
    
  4. Voeg de volgende Track methode overschrijven toe. Er zijn verschillende soorten traceringsrecords. We zijn geïnteresseerd in de uitvoer van activiteiten, die zijn opgenomen in records voor het bijhouden van WriteLine activiteiten. Als het TrackingRecord een voor een WriteLine activiteit is, wordt de Text van de WriteLine activiteit toegevoegd aan een bestand met de naam van de InstanceId werkstroom.ActivityTrackingRecord In deze zelfstudie wordt het bestand opgeslagen in de huidige map van de hosttoepassing.

    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();  
                }  
            }  
        }  
    }  
    

    Wanneer er geen traceringsprofiel is opgegeven, wordt het standaardtrackingsprofiel gebruikt. Wanneer het standaardtraceringsprofiel wordt gebruikt, worden traceringsrecords voor iedereen ActivityStatesverzonden. Omdat we de tekst slechts één keer hoeven vast te leggen tijdens de levenscyclus van de WriteLine activiteit, halen we alleen de tekst uit de ActivityStates.Executing status op. Als u het traceringsprofiel wilt maken en de deelnemer wilt registreren, wordt er een traceringsprofiel gemaakt dat aangeeft dat alleen WriteLine ActivityStates.Executing traceringsrecords worden verzonden.

Het traceringsprofiel maken en de deelnemer registreren

  1. Klik met de rechtermuisknop op WorkflowHostForm in Solution Explorer en kies Code weergeven.

  2. Voeg de volgende using (of Imports) instructie toe boven aan het bestand met de andere using (of Imports) instructies.

    Imports System.Activities.Tracking  
    
    using System.Activities.Tracking;  
    
  3. Voeg de volgende code toe aan ConfigureWorkflowApplication net na de code waarmee de StringWriter werkstroomextensies en vóór de werkstroomlevenshandlers worden toegevoegd.

    '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);  
    

    Dit traceringsprofiel geeft aan dat alleen activiteitenstatusrecords voor WriteLine activiteiten in de Executing status worden verzonden naar de aangepaste traceringsdeelnemer.

    Nadat u de code hebt toegevoegd, ziet het begin van ConfigureWorkflowApplication de code eruit zoals in het volgende voorbeeld.

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

De traceringsgegevens weergeven

  1. Klik met de rechtermuisknop op WorkflowHostForm in Solution Explorer en kies Code weergeven.

  2. Voeg in de InstanceId_SelectedIndexChanged handler de volgende code toe direct na de code waarmee het statusvenster wordt gewist.

    '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);  
    }  
    

    Wanneer een nieuwe werkstroom is geselecteerd in de werkstroomlijst, worden de traceringsrecords voor die werkstroom geladen en weergegeven in het statusvenster. Het volgende voorbeeld is de voltooide InstanceId_SelectedIndexChanged handler.

    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();  
        }  
    }  
    

De toepassing bouwen en uitvoeren

  1. Druk op Ctrl+Shift+B om de toepassing te bouwen.

  2. Druk op Ctrl+F5 om de toepassing te starten.

  3. Selecteer een bereik voor het gokspel en het type werkstroom dat u wilt starten en klik op Nieuw spel. Voer een schatting in het vak Schatting in en klik op Ga om uw schatting in te dienen. De status van de werkstroom wordt weergegeven in het statusvenster. Deze uitvoer wordt vastgelegd vanuit de WriteLine activiteiten. Schakel over naar een andere werkstroom door er een te selecteren in de keuzelijst met invoervak Werkstroomexemplaren en u ziet dat de status van de huidige werkstroom wordt verwijderd. Ga terug naar de vorige werkstroom en merk op dat de status is hersteld, vergelijkbaar met het volgende voorbeeld.

    Notitie

    Als u overschakelt naar een werkstroom die is gestart voordat bijhouden is ingeschakeld, wordt er geen status weergegeven. Als u echter extra schattingen maakt, wordt de status opgeslagen omdat bijhouden nu is ingeschakeld.

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

    Notitie

    Deze informatie is handig voor het bepalen van het bereik van het willekeurige getal, maar bevat geen informatie over welke schattingen eerder zijn gemaakt. Deze informatie vindt u in de volgende stap: Meerdere versies van een werkstroom naast elkaar hosten.

    Noteer de id van het werkstroomexemplaren en speel de game door totdat deze is voltooid.

  4. Open Windows Verkenner en navigeer naar de map NumberGuessWorkflowHost\bin\debug (of bin\release , afhankelijk van uw projectinstellingen). Houd er rekening mee dat er naast de uitvoerbare projectbestanden ook bestanden met GUID-bestandsnamen zijn. Identificeer de id die overeenkomt met de id van het werkstroomexemplaren uit de voltooide werkstroom in de vorige stap en open deze in Kladblok. De traceringsgegevens bevatten informatie die er ongeveer als volgt uitziet.

    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
    

    Naast het ontbreken van de schattingen van de gebruiker, bevatten deze traceringsgegevens geen informatie over de uiteindelijke schatting van de werkstroom. Dat komt doordat de traceringsinformatie alleen bestaat uit de WriteLine uitvoer van de werkstroom en het uiteindelijke bericht dat wordt weergegeven, wordt uitgevoerd vanuit de Completed handler nadat de werkstroom is voltooid. In de volgende stap van de zelfstudie: Meerdere versies van een werkstroom naast elkaar hosten, worden de bestaande WriteLine activiteiten gewijzigd om de schattingen van de gebruiker weer te geven en er wordt een extra WriteLine activiteit toegevoegd waarmee de uiteindelijke resultaten worden weergegeven. Nadat deze wijzigingen zijn geïntegreerd, laat u zien hoe u meerdere versies van een werkstroom tegelijk host.