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í
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.Do horní části souboru přidejte následující
using
příkazy (neboImports
) s jinýmiusing
příkazy (neboImports
).Imports System.Activities.Tracking Imports System.IO
using System.Activities.Tracking; using System.IO;
StatusTrackingParticipant
Upravte třídu tak, aby dědila zTrackingParticipant
.Public Class StatusTrackingParticipant Inherits TrackingParticipant End Class
class StatusTrackingParticipant : TrackingParticipant { }
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áznamechWriteLine
sledování aktivit. Pokud se jednáTrackingRecord
oActivityTrackingRecord
WriteLine
aktivitu,WriteLine
Text
připojí se k souboru pojmenovaném poInstanceId
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
ActivityStates
záznamy sledování vygenerují . Vzhledem k tomu, že text potřebujeme zachytit jen jednou během životního cykluWriteLine
aktivity, extrahujeme pouze text zeActivityStates.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í pouzeWriteLine
ActivityStates.Executing
záznamy sledování.
Vytvoření profilu sledování a registrace účastníka sledování
Pravým tlačítkem myši klikněte na WorkflowHostForm v Průzkumník řešení a zvolte Zobrazit kód.
Do horní části souboru přidejte následující
using
příkaz (neboImports
) s jinýmiusing
příkazy (neboImports
).Imports System.Activities.Tracking
using System.Activities.Tracking;
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 oWriteLine
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í
Pravým tlačítkem myši klikněte na WorkflowHostForm v Průzkumník řešení a zvolte Zobrazit kód.
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
Stisknutím kombinace kláves Ctrl+Shift+B sestavte aplikaci.
Stisknutím kombinace kláves Ctrl+F5 spusťte aplikaci.
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í.
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 zCompleted
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ě.