Nasıl yapılır: Özel İzleme Katılımcısı Oluşturma

İş akışı izleme, iş akışı yürütme durumunun görünürlüğünü sağlar. İş akışı çalışma zamanı, iş akışı yaşam döngüsü olaylarını, etkinlik yaşam döngüsü olaylarını, yer işareti yeniden başlatmalarını ve hataları açıklayan izleme kayıtlarını yayar. Bu izleme kayıtları, izleme katılımcıları tarafından tüketilir. Windows Workflow Foundation (WF), izleme kayıtlarını Windows için Olay İzleme (ETW) olayları olarak yazan standart bir izleme katılımcısı içerir. Bu, gereksinimlerinizi karşılamıyorsa özel bir izleme katılımcısı da yazabilirsiniz. Bu öğretici adımında, kullanıcıya görüntülenebilmeleri için etkinliklerin çıkışını yakalayan özel bir izleme katılımcısı WriteLine ve izleme profili oluşturma açıklanmaktadır.

Özel izleme katılımcısı oluşturmak için

  1. Çözüm Gezgini'da NumberGuessWorkflowHost'a sağ tıklayın ve Ekle, Sınıf'ı seçin. Ad kutusuna yazın StatusTrackingParticipant ve Ekle'ye tıklayın.

  2. Dosyanın en üstüne aşağıdaki using (veya Imports) deyimlerini diğer using (veya Imports) deyimleriyle ekleyin.

    Imports System.Activities.Tracking  
    Imports System.IO  
    
    using System.Activities.Tracking;  
    using System.IO;  
    
  3. sınıfından StatusTrackingParticipant devralınması TrackingParticipantiçin sınıfını değiştirin.

    Public Class StatusTrackingParticipant  
        Inherits TrackingParticipant  
    
    End Class  
    
    class StatusTrackingParticipant : TrackingParticipant  
    {  
    }  
    
  4. Aşağıdaki Track yöntemi geçersiz kılmayı ekleyin. Birkaç farklı izleme kaydı türü vardır. Etkinlik izleme kayıtlarında yer alan etkinliklerin WriteLine çıkışıyla ilgileniyoruz. TrackingRecord bir etkinlik için WriteLine iseActivityTrackingRecord, Text öğesinin WriteLine adı iş akışının adından sonra gelen bir dosyaya InstanceId eklenir. Bu öğreticide, dosya konak uygulamasının geçerli klasörüne kaydedilir.

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

    İzleme profili belirtilmediğinde varsayılan izleme profili kullanılır. Varsayılan izleme profili kullanıldığında, izleme kayıtları tüm ActivityStatesiçin yayılır. Etkinliğin yaşam döngüsü boyunca metni yalnızca bir kez yakalamamız gerektiğinden WriteLine , metni yalnızca durumdan ActivityStates.Executing ayıklarız. İzleme profilini oluşturmak ve izleme katılımcısını kaydetmek için bölümünde, yalnızca WriteLine ActivityStates.Executing izleme kayıtlarının yayıldığını belirten bir izleme profili oluşturulur.

İzleme profilini oluşturmak ve izleme katılımcısını kaydetmek için

  1. Çözüm Gezgini'da WorkflowHostForm'a sağ tıklayın ve Kodu Görüntüle'yi seçin.

  2. Dosyanın en üstüne aşağıdaki using (veya Imports) deyimini diğer using (veya Imports) deyimleriyle ekleyin.

    Imports System.Activities.Tracking  
    
    using System.Activities.Tracking;  
    
  3. aşağıdaki kodu iş akışı uzantılarına ConfigureWorkflowApplication ekleyen StringWriter kodun hemen arkasına ve iş akışı yaşam döngüsü işleyicilerinden önce ekleyin.

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

    Bu izleme profili, özel izleme katılımcısına yalnızca durumdaki Executing etkinlikler için WriteLine etkinlik durumu kayıtlarının yayıldığını belirtir.

    Kodu ekledikten sonra, başlangıcı ConfigureWorkflowApplication aşağıdaki örneğe benzer olacaktır.

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

İzleme bilgilerini görüntülemek için

  1. Çözüm Gezgini'da WorkflowHostForm'a sağ tıklayın ve Kodu Görüntüle'yi seçin.

  2. İşleyicide InstanceId_SelectedIndexChanged , durum penceresini temizleyen kodun hemen arkasına aşağıdaki kodu ekleyin.

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

    İş akışı listesinde yeni bir iş akışı seçildiğinde, bu iş akışının izleme kayıtları yüklenir ve durum penceresinde görüntülenir. Aşağıdaki örnek tamamlanmış InstanceId_SelectedIndexChanged işleyicidir.

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

Uygulamayı derlemek ve çalıştırmak için

  1. Uygulamayı derlemek için Ctrl+Shift+B tuşlarına basın.

  2. Uygulamayı başlatmak için Ctrl+F5 tuşlarına basın.

  3. Tahmin oyunu ve başlatacak iş akışı türü için bir aralık seçin ve Yeni Oyun'a tıklayın. Tahmin kutusuna bir tahmin girin ve tahmininizi göndermek için Git'e tıklayın. İş akışının durumunun durum penceresinde görüntülendiğini unutmayın. Bu çıkış etkinliklerden yakalanır WriteLine . İş Akışı Örneği Kimliği birleşik giriş kutusundan birini seçerek farklı bir iş akışına geçin ve geçerli iş akışının durumunun kaldırıldığını unutmayın. Önceki iş akışına dönün ve aşağıdaki örneğe benzer şekilde durumun geri yüklendiğini unutmayın.

    Not

    İzleme etkinleştirilmeden önce başlatılan bir iş akışına geçerseniz hiçbir durum görüntülenmez. Ancak ek tahminlerde bulunursanız izleme etkinleştirildiğinden bu tahminlerin durumu kaydedilir.

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

    Not

    Bu bilgiler rastgele sayının aralığını belirlemek için yararlıdır, ancak daha önce hangi tahminlerin yapıldığı hakkında herhangi bir bilgi içermez. Bu bilgiler bir sonraki adım olan Nasıl yapılır: bir İş Akışının Birden Çok Sürümünü Yan Yana Barındırma.

    İş akışı örneği kimliğini not edin ve oyunun tamamlanmasını sağlayın.

  4. Windows Gezgini'ni açın ve NumberGuessWorkflowHost\bin\debug klasörüne (veya proje ayarlarınıza bağlı olarak bin\release ) gidin. Proje yürütülebilir dosyalarına ek olarak guid dosya adlarına sahip dosyalar da olduğunu unutmayın. Önceki adımda tamamlanan iş akışından iş akışı örneği kimliğine karşılık geleni belirleyin ve Not Defteri'nde açın. İzleme bilgileri aşağıdakine benzer bilgiler içerir.

    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
    

    Kullanıcının tahminlerinin olmamasının yanı sıra, bu izleme verileri iş akışının son tahmini hakkında bilgi içermez. Bunun nedeni, izleme bilgilerinin yalnızca iş akışı çıkışından WriteLine oluşması ve görüntülenen son iletinin iş akışı tamamlandıktan sonra işleyiciden Completed yapılmasıdır. Öğreticinin sonraki adımı olan Nasıl yapılır: bir İş Akışının Birden Çok Sürümünü Yan Yana Barındırma, kullanıcının tahminlerini görüntülemek için mevcut WriteLine etkinlikler değiştirilir ve son sonuçları görüntüleyen ek WriteLine bir etkinlik eklenir. Bu değişiklikler tümleştirildikten sonra Nasıl yapılır: bir İş Akışının Birden Çok Sürümünü Yan Yana Barındırma, bir iş akışının birden çok sürümünü aynı anda barındırmayı gösterir.