Cara: Membuat Peserta Pelacakan Kustom
Pelacakan alur kerja memberikan visibilitas ke dalam status eksekusi alur kerja. Runtime bahasa umum alur kerja menghasilkan catatan pelacakan yang menggambarkan kejadian siklus hidup alur kerja, kejadian siklus hidup aktivitas, kelanjutan jangkar, dan kesalahan. Catatan pelacakan ini digunakan oleh peserta pelacakan. Windows Workflow Foundation (WF) menyertakan peserta pelacakan standar yang menulis catatan pelacakan sebagai kejadian Pelacakan Kejadian untuk Windows (ETW). Jika cara tersebut tidak memenuhi kebutuhan Anda, Anda juga dapat menulis peserta pelacakan kustom. Langkah dalam tutorial ini menjelaskan cara membuat peserta pelacakan kustom dan profil pelacakan yang menangkap output aktivitas WriteLine
sehingga dapat ditampilkan kepada pengguna.
Untuk membuat peserta pelacakan kustom
Klik kanan NumberGuessWorkflowHost di Penjelajah Solusi dan pilih Tambahkan, Kelas. Ketik
StatusTrackingParticipant
ke dalam kotak Nama, lalu klik Tambahkan.Tambahkan pernyataan
using
(atauImports
) berikut di bagian atas file dengan pernyataanusing
(atauImports
) lainnya.Imports System.Activities.Tracking Imports System.IO
using System.Activities.Tracking; using System.IO;
Ubah kelas
StatusTrackingParticipant
sehingga mewarisi dariTrackingParticipant
.Public Class StatusTrackingParticipant Inherits TrackingParticipant End Class
class StatusTrackingParticipant : TrackingParticipant { }
Tambahkan ambil alih metode
Track
berikut: Terdapat beberapa jenis catatan pelacakan. Kita berfokus pada output aktivitasWriteLine
, yang terkandung dalam catatan pelacakan aktivitas. JikaTrackingRecord
adalahActivityTrackingRecord
untuk aktivitasWriteLine
,Text
dariWriteLine
ditambahkan ke file yang dinamai sesuaiInstanceId
dari alur kerja. Dalam tutorial ini, file disimpan ke folder aplikasi host saat ini.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(); } } } }
Ketika tidak ada profil pelacakan yang ditentukan, profil pelacakan default digunakan. Saat profil pelacakan default digunakan, catatan pelacakan dihasilkan untuk semua
ActivityStates
. Karena kita hanya perlu mengambil teks satu kali selama siklus hidup aktivitasWriteLine
, kita hanya mengekstrak teks dari statusActivityStates.Executing
. Di Untuk membuat profil pelacakan dan mendaftarkan peserta pelacakan, profil pelacakan dibuat yang menentukan bahwa hanya catatan pelacakanWriteLine
ActivityStates.Executing
yang dihasilkan.
Untuk membuat profil pelacakan dan mendaftarkan peserta pelacakan
Klik kanan WorkflowHostForm di Penjelajah Solusi dan pilih Lihat Kode.
Tambahkan pernyataan
using
(atauImports
) berikut di bagian atas file dengan pernyataanusing
(atauImports
) lainnya.Imports System.Activities.Tracking
using System.Activities.Tracking;
Tambahkan kode berikut ke
ConfigureWorkflowApplication
tepat setelah kode yang menambahkanStringWriter
ke ekstensi alur kerja dan sebelum penangan siklus hidup alur kerja.'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);
Profil pelacakan ini menentukan bahwa hanya catatan status aktivitas untuk aktivitas
WriteLine
dalam statusExecuting
yang dihasilkan kepada peserta pelacakan kustom.Setelah menambahkan kode, awal
ConfigureWorkflowApplication
akan terlihat seperti contoh berikut.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...
Untuk menampilkan informasi pelacakan
Klik kanan WorkflowHostForm di Penjelajah Solusi dan pilih Lihat Kode.
Di penghandel
InstanceId_SelectedIndexChanged
, tambahkan kode berikut tepat setelah kode yang menghapus jendela status.'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); }
Saat alur kerja baru dipilih dalam daftar alur kerja, catatan pelacakan untuk alur kerja tersebut dimuat dan ditampilkan di jendela status. Contoh berikut adalah penangan
InstanceId_SelectedIndexChanged
yang telah selesai.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(); } }
Untuk membangun dan menjalankan aplikasi
Tekan Ctrl+Shift+B untuk membuat aplikasi.
Tekan Ctrl+F5 untuk memulai aplikasi.
Pilih rentang permainan tebak-tebakan dan jenis alur kerja yang akan dimulai, lalu klik Game Baru. Masukkan tebakan di kotak Tebakan dan klik Buka untuk mengirimkan tebakan Anda. Perhatikan bahwa status alur kerja ditampilkan di jendela status. Output ini diambil dari aktivitas
WriteLine
. Beralih ke alur kerja lain dengan memilih salah satu dari kotak kombo Id Instans Alur Kerja dan perhatikan bahwa status alur kerja saat ini dihapus. Beralih kembali ke alur kerja sebelumnya dan perhatikan bahwa status dipulihkan, mirip dengan contoh berikut.Catatan
Jika Anda beralih ke alur kerja yang dimulai sebelum pelacakan diaktifkan, tidak ada status yang ditampilkan. Namun, jika Anda membuat tebakan tambahan, statusnya disimpan karena pelacakan sekarang diaktifkan.
Please enter a number between 1 and 10 Your guess is too high. Please enter a number between 1 and 10
Catatan
Informasi ini berguna untuk menentukan rentang angka acak, tetapi tidak berisi informasi apa pun tentang tebakan apa yang telah dibuat sebelumnya. Informasi ini ada di langkah berikutnya, Cara: Menghosting Beberapa Versi Alur Kerja Berdampingan.
Catat id instans alur kerja, dan mainkan game hingga selesai.
Buka Windows Explorer dan arahkan ke folder NumberGuessWorkflowActivities\bin\Debug (atau bin\Release tergantung pada pengaturan proyek Anda). Perhatikan bahwa selain file proyek yang dapat dieksekusi, terdapat file dengan nama file guid. Identifikasi file yang sesuai dengan id instans alur kerja dari alur kerja yang telah selesai pada langkah sebelumnya dan buka di Notepad. Informasi pelacakan berisi informasi yang serupa dengan informasi berikut.
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
Selain tidak adanya tebakan pengguna, data pelacakan ini tidak berisi informasi tentang tebakan akhir alur kerja. Hal ini karena informasi pelacakan hanya terdiri dari output
WriteLine
dari alur kerja, dan pesan akhir yang ditampilkan dilakukan dari penghandelCompleted
setelah alur kerja selesai. Pada langkah tutorial berikutnya, Cara: Menghosting Beberapa Versi Alur Kerja Berdampingan, aktivitasWriteLine
yang ada dimodifikasi untuk menampilkan tebakan pengguna, dan aktivitasWriteLine
tambahan ditambahkan yang menampilkan hasil akhir. Setelah perubahan ini terintegrasi, Cara: Menghosting Beberapa Versi Alur Kerja Berdampingan menunjukkan cara menghosting beberapa versi alur kerja secara bersamaan.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk