Bagikan melalui


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

  1. Klik kanan NumberGuessWorkflowHost di Penjelajah Solusi dan pilih Tambahkan, Kelas. Ketik StatusTrackingParticipant ke dalam kotak Nama, lalu klik Tambahkan.

  2. Tambahkan pernyataan using (atau Imports) berikut di bagian atas file dengan pernyataan using (atau Imports) lainnya.

    Imports System.Activities.Tracking  
    Imports System.IO  
    
    using System.Activities.Tracking;  
    using System.IO;  
    
  3. Ubah kelas StatusTrackingParticipant sehingga mewarisi dari TrackingParticipant.

    Public Class StatusTrackingParticipant  
        Inherits TrackingParticipant  
    
    End Class  
    
    class StatusTrackingParticipant : TrackingParticipant  
    {  
    }  
    
  4. Tambahkan ambil alih metode Track berikut: Terdapat beberapa jenis catatan pelacakan. Kita berfokus pada output aktivitas WriteLine, yang terkandung dalam catatan pelacakan aktivitas. Jika TrackingRecord adalah ActivityTrackingRecord untuk aktivitas WriteLine, Text dari WriteLine ditambahkan ke file yang dinamai sesuai InstanceId 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 aktivitas WriteLine, kita hanya mengekstrak teks dari status ActivityStates.Executing. Di Untuk membuat profil pelacakan dan mendaftarkan peserta pelacakan, profil pelacakan dibuat yang menentukan bahwa hanya catatan pelacakan WriteLineActivityStates.Executing yang dihasilkan.

Untuk membuat profil pelacakan dan mendaftarkan peserta pelacakan

  1. Klik kanan WorkflowHostForm di Penjelajah Solusi dan pilih Lihat Kode.

  2. Tambahkan pernyataan using (atau Imports) berikut di bagian atas file dengan pernyataan using (atau Imports) lainnya.

    Imports System.Activities.Tracking  
    
    using System.Activities.Tracking;  
    
  3. Tambahkan kode berikut ke ConfigureWorkflowApplication tepat setelah kode yang menambahkan StringWriter 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 status Executing 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

  1. Klik kanan WorkflowHostForm di Penjelajah Solusi dan pilih Lihat Kode.

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

  1. Tekan Ctrl+Shift+B untuk membuat aplikasi.

  2. Tekan Ctrl+F5 untuk memulai aplikasi.

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

  4. 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 penghandel Completed setelah alur kerja selesai. Pada langkah tutorial berikutnya, Cara: Menghosting Beberapa Versi Alur Kerja Berdampingan, aktivitas WriteLine yang ada dimodifikasi untuk menampilkan tebakan pengguna, dan aktivitas WriteLine 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.