Sdílet prostřednictvím


Postupy: Vytvoření vlastního účastníka sledování

Sledování pracovního postupu poskytuje přehled o stavu provádění pracovního postupu. Modul runtime pracovního postupu generuje záznamy sledování, které popisují události životního cyklu pracovního postupu, události životního cyklu aktivit, obnovení záložek a chyby. Tyto záznamy sledování využívají sledování účastníků. Windows Workflow Foundation (WF) obsahuje standardního účastníka sledování, který zapisuje záznamy sledování jako události Trasování událostí pro Windows (ETW). Je-li který nesplňuje vaše požadavky, můžete také napsat vlastní sledování účastník. Tento krok kurzu popisuje, jak vytvořit vlastní profil účastníka sledování a sledování, který zachycuje výstup WriteLine aktivit, aby se mohli uživateli zobrazit.

Vytvoření vlastního účastníka sledování

  1. Klikněte pravým tlačítkem na NumberGuessWorkflowHost v Průzkumník řešení a zvolte Přidat, Třída. Zadejte StatusTrackingParticipant do pole Název a klikněte na Přidat.

  2. Do horní části souboru přidejte následující using příkazy (nebo Imports) s jinými using příkazy (nebo Imports).

    Imports System.Activities.Tracking  
    Imports System.IO  
    
    using System.Activities.Tracking;  
    using System.IO;  
    
  3. StatusTrackingParticipant Upravte třídu tak, aby dědila z TrackingParticipant.

    Public Class StatusTrackingParticipant  
        Inherits TrackingParticipant  
    
    End Class  
    
    class StatusTrackingParticipant : TrackingParticipant  
    {  
    }  
    
  4. Přidejte následující Track přepsání metody. Existuje několik různých typů záznamů sledování. Zajímáme se o výstup aktivit, které jsou obsaženy v záznamech WriteLine sledování aktivit. Pokud se jedná TrackingRecord o ActivityTrackingRecord WriteLine aktivitu, WriteLine Text připojí se k souboru pojmenovaném po InstanceId pracovním postupu. V tomto kurzu se soubor uloží do aktuální složky hostitelské aplikace.

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

    Pokud není zadán žádný profil sledování, použije se výchozí profil sledování. Při použití výchozího profilu sledování se pro všechny ActivityStateszáznamy sledování vygenerují . Vzhledem k tomu, že text potřebujeme zachytit jen jednou během životního cyklu WriteLine aktivity, extrahujeme pouze text ze ActivityStates.Executing stavu. V části Vytvoření profilu sledování a registraci účastníka sledování se vytvoří profil sledování, který určuje, že se vygenerují pouze WriteLine ActivityStates.Executing záznamy sledování.

Vytvoření profilu sledování a registrace účastníka sledování

  1. Pravým tlačítkem myši klikněte na WorkflowHostForm v Průzkumník řešení a zvolte Zobrazit kód.

  2. Do horní části souboru přidejte následující using příkaz (nebo Imports) s jinými using příkazy (nebo Imports).

    Imports System.Activities.Tracking  
    
    using System.Activities.Tracking;  
    
  3. Přidejte následující kód těsně ConfigureWorkflowApplication za kód, který přidá StringWriter do rozšíření pracovního postupu a před obslužné rutiny životního cyklu pracovního postupu.

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

    Tento profil sledování určuje, že vlastní účastník sledování vygeneruje Executing pouze záznamy o WriteLine stavu aktivit ve stavu.

    Po přidání kódu bude začátek ConfigureWorkflowApplication vypadat jako v následujícím příkladu.

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

Zobrazení informací o sledování

  1. Pravým tlačítkem myši klikněte na WorkflowHostForm v Průzkumník řešení a zvolte Zobrazit kód.

  2. InstanceId_SelectedIndexChanged Do obslužné rutiny přidejte následující kód bezprostředně za kód, který vymaže stavové okno.

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

    Při výběru nového pracovního postupu v seznamu pracovních postupů se načtou a zobrazí záznamy sledování pro tento pracovní postup v okně stavu. Následující příklad je dokončená obslužná InstanceId_SelectedIndexChanged rutina.

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

Sestavení a spuštění aplikace

  1. Stisknutím kombinace kláves Ctrl+Shift+B sestavte aplikaci.

  2. Stisknutím kombinace kláves Ctrl+F5 spusťte aplikaci.

  3. Vyberte oblast pro hádanou hru a typ pracovního postupu, který chcete spustit, a klikněte na Tlačítko Nová hra. Do pole Hádejte zadejte odhad a kliknutím na Přejít odešlete svůj odhad. Všimněte si, že stav pracovního postupu se zobrazí v okně stavu. Tento výstup se zaznamenává z WriteLine aktivit. Přepněte na jiný pracovní postup tak, že ho vyberete ze pole se seznamem ID instance pracovního postupu a všimněte si, že se odebere stav aktuálního pracovního postupu. Přepněte zpět na předchozí pracovní postup a všimněte si, že se stav obnoví, podobně jako v následujícím příkladu.

    Poznámka:

    Pokud přepnete na pracovní postup, který byl spuštěn před povolením sledování, nezobrazí se žádný stav. Pokud ale provedete další odhady, uloží se jejich stav, protože sledování je teď povolené.

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

    Poznámka:

    Tyto informace jsou užitečné pro určení rozsahu náhodného čísla, ale neobsahuje žádné informace o tom, jaké odhady byly provedeny dříve. Tyto informace jsou v dalším kroku: Hostování více verzí pracovního postupu vedle sebe.

    Poznamenejte si ID instance pracovního postupu a přehrajte hru až do dokončení.

  4. Otevřete Průzkumníka Windows a přejděte do složky NumberGuessWorkflowHost\bin\debug (nebo bin\release v závislosti na nastavení projektu). Všimněte si, že kromě spustitelných souborů projektu existují soubory s názvy guid. Identifikujte id instance pracovního postupu z dokončeného pracovního postupu v předchozím kroku a otevřete ho v Poznámkovém bloku. Informace o sledování obsahují podobné informace.

    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
    

    Kromě nepřítomnosti odhadů uživatele tato sledovací data neobsahují informace o konečném odhadu pracovního postupu. Je to proto, že informace o sledování se skládají pouze WriteLine z výstupu pracovního postupu a konečná zpráva, která se zobrazí, se provede z Completed obslužné rutiny po dokončení pracovního postupu. V dalším kroku kurzu Postupy: Hostování více verzí pracovního postupu vedle sebe se stávající WriteLine aktivity upraví tak, aby zobrazovaly odhady uživatele, a přidá se další WriteLine aktivita, která zobrazí konečné výsledky. Po integraci těchto změn postupy: Hostování více verzí pracovního postupu vedle sebe ukazuje, jak hostovat více verzí pracovního postupu současně.