Aracılığıyla paylaş


Nasıl yapılır: İş Akışı Çalıştırma

Bu konu, Windows Workflow Foundation Kullanmaya Başlama öğreticisinin devamıdır ve bir iş akışı konağı oluşturma ve önceki Nasıl yapılır: İş Akışı Oluşturma konusunda tanımlanan iş akışını çalıştırmayı açıklar.

Not

Başlarken öğreticisindeki her konu önceki konulara bağlıdır. Bu konuyu tamamlamak için önce Nasıl yapılır: Etkinlik Oluşturma ve Nasıl yapılır: İş Akışı Oluşturma'yı tamamlamanız gerekir.

İş akışı barındırıcı projesini oluşturmak için

  1. Visual Studio 2012 kullanarak önceki Nasıl yapılır: Etkinlik oluşturma konusunun çözümünü açın.

  2. Çözüm Gezgini WF45GettingStartedTutorial çözümüne sağ tıklayın ve Ekle, Yeni Proje'yi seçin.

    İpucu

    Çözüm Gezgini penceresi görüntülenmiyorsa Görünüm menüsünden Çözüm Gezginiseçin.

  3. Yüklü düğümde Visual C#, İş Akışı (veya Visual Basic, İş Akışı) öğesini seçin.

    Not

    Visual Studio'da birincil dil olarak yapılandırılan programlama diline bağlı olarak, Visual C# veya Visual Basic düğümü Yüklü düğümdeki Diğer Diller düğümü altında olabilir.

    .NET Framework sürüm açılır listesinden .NET Framework 4.5'in seçili olduğundan emin olun. İş Akışı listesinden İş Akışı Konsol Uygulaması'nı seçin. Ad kutusuna yazın NumberGuessWorkflowHost ve Tamam'a tıklayın. Bu, temel iş akışı barındırma desteğine sahip bir başlangıç iş akışı uygulaması oluşturur. Bu temel barındırma kodu değiştirilir ve iş akışı uygulamasını çalıştırmak için kullanılır.

  4. Çözüm Gezgini'nde yeni eklenen NumberGuessWorkflowHost projesine sağ tıklayın ve Başvuru Ekle'yi seçin. Başvuru Ekle listesinden Çözüm'ü seçin, NumberGuessWorkflowActivities öğesinin yanındaki onay kutusunu işaretleyin ve ardından Tamam'a tıklayın.

  5. Çözüm Gezgini workflow1.xaml öğesine sağ tıklayın ve Sil'i seçin. Onaylamak için Tamam'a tıklayın.

İş akışı barındırma kodunu değiştirmek için

  1. Çözüm Gezgini'nde Program.cs veya Module1.vb dosyalarına çift tıklayarak kodu görüntüleyin.

    İpucu

    Çözüm Gezgini penceresi görüntülenmiyorsa Görünüm menüsünden Çözüm Gezginiseçin.

    Bu proje İş Akışı Konsolu Uygulaması şablonu kullanılarak oluşturulduğundan, Program.cs veya Module1.vb aşağıdaki temel iş akışı barındırma kodunu içerir.

    ' Create and cache the workflow definition.
    Dim workflow1 As Activity = New Workflow1()
    WorkflowInvoker.Invoke(workflow1)
    
    // Create and cache the workflow definition.
    Activity workflow1 = new Workflow1();
    WorkflowInvoker.Invoke(workflow1);
    

    Bu oluşturulan barındırma kodu, WorkflowInvoker kullanır. WorkflowInvoker bir iş akışını bir yöntem çağrısıymış gibi çağırmak için basit bir yol sağlar ve yalnızca kalıcılık kullanmayan iş akışları için kullanılabilir. WorkflowApplication, yaşam döngüsü olayları bildirimi, yürütme denetimi, yer işareti yeniden başlatma ve kalıcılığı içeren iş akışlarını yürütmek için daha zengin bir model sağlar. Bu örnek yer işaretlerini kullanır ve WorkflowApplication iş akışını barındırmak için kullanılır. using ifadesini, mevcut using veya Imports deyimlerinin altına Program.cs veya Module1.vb'nin en üstüne ekleyin.

    Imports NumberGuessWorkflowActivities
    Imports System.Threading
    
    using NumberGuessWorkflowActivities;
    using System.Threading;
    

    kullanılan WorkflowInvoker kod satırlarını aşağıdaki temel WorkflowApplication barındırma koduyla değiştirin. Bu örnek barındırma kodu, bir iş akışını barındırmaya ve çağırmaya yönelik temel adımları gösterir, ancak henüz bu konu başlığından iş akışını başarıyla çalıştırma işlevini içermez. Aşağıdaki adımlarda, bu temel kod değiştirilir ve uygulama tamamlanana kadar ek özellikler eklenir.

    Not

    Önceki Bir İş Akışı Oluşturma adımında hangi iş akışını tamamladığınıza bağlı olarak, bu örneklerde Workflow1 öğesini FlowchartNumberGuessWorkflow, SequentialNumberGuessWorkflow veya StateMachineNumberGuessWorkflow ile değiştirmeniz gerekir. Değiştirmezseniz Workflow1 , iş akışını derlemeyi veya çalıştırmayı denediğinizde derleme hataları alırsınız.

    AutoResetEvent syncEvent = new AutoResetEvent(false);
    
    WorkflowApplication wfApp =
        new WorkflowApplication(_wf);
    
    wfApp.Completed = delegate (WorkflowApplicationCompletedEventArgs e)
    {
        syncEvent.Set();
    };
    
    wfApp.Aborted = delegate (WorkflowApplicationAbortedEventArgs e)
    {
        Console.WriteLine(e.Reason);
        syncEvent.Set();
    };
    
    wfApp.OnUnhandledException = delegate (WorkflowApplicationUnhandledExceptionEventArgs e)
    {
        Console.WriteLine(e.UnhandledException.ToString());
        return UnhandledExceptionAction.Terminate;
    };
    
    wfApp.Run();
    
    syncEvent.WaitOne();
    
    Dim syncEvent As New AutoResetEvent(False)
    
    Dim wfApp As New WorkflowApplication(New Workflow1())
    
    wfApp.Completed =
        Sub(e As WorkflowApplicationCompletedEventArgs)
            syncEvent.Set()
        End Sub
    
    wfApp.Aborted =
        Sub(e As WorkflowApplicationAbortedEventArgs)
            Console.WriteLine(e.Reason)
            syncEvent.Set()
        End Sub
    
    wfApp.OnUnhandledException =
        Function(e As WorkflowApplicationUnhandledExceptionEventArgs)
            Console.WriteLine(e.UnhandledException)
            Return UnhandledExceptionAction.Terminate
        End Function
    
    wfApp.Run()
    
    syncEvent.WaitOne()
    

    Bu kod, bir WorkflowApplication oluşturur, üç iş akışı yaşam döngüsü olayına abone olur, Run çağrısıyla iş akışını başlatır ve ardından iş akışının tamamlanmasını bekler. İş akışı tamamlandığında, AutoResetEvent ayarlanır ve host uygulaması tamamlanır.

Bir iş akışının giriş bağımsız değişkenlerini ayarlamak için

  1. Var olan using veya Imports deyimlerinin altına Program.cs veya Module1.vb dosyasının en üstüne aşağıdaki deyimi ekleyin.

  2. Yeni bir WorkflowApplication oluşturan kod satırını, oluşturulduğunda iş akışına bir parametre sözlüğü oluşturan ve geçen aşağıdaki kodla değiştirin.

    Not

    Lütfen, önceki Nasıl Yapılır: İş Akışı Oluşturma adımında tamamladığınız iş akışına göre, bu örneklerdeki Workflow1 öğesini FlowchartNumberGuessWorkflow, SequentialNumberGuessWorkflow, veya StateMachineNumberGuessWorkflow ile değiştirin. Değiştirmezseniz Workflow1 , iş akışını derlemeyi veya çalıştırmayı denediğinizde derleme hataları alırsınız.

    var inputs = new Dictionary<string, object>() { { "MaxNumber", 100 } };
    
    WorkflowApplication wfApp = new(_wf, inputs)
    {
    
    Dim inputs As New Dictionary(Of String, Object)
    inputs.Add("MaxNumber", 100)
    
    Dim wfApp As New WorkflowApplication(New Workflow1(), inputs)
    

    Bu sözlük, anahtarına MaxNumbersahip bir öğe içerir. Giriş sözlüğündeki anahtarlar, iş akışının kökündeki etkinlikte yer alan giriş bağımsız değişkenlerine karşılık gelir. MaxNumber iş akışı tarafından rastgele oluşturulan sayı için üst sınırı belirlemek için kullanılır.

Bir iş akışının çıkış bağımsız değişkenlerini almak amacıyla

  1. Completed İş akışı tarafından kullanılan dönüş sayısını almak ve görüntülemek için işleyiciyi değiştirin.

    Completed = delegate (WorkflowApplicationCompletedEventArgs e)
    {
        int Turns = Convert.ToInt32(e.Outputs["Turns"]);
        Console.WriteLine("Congratulations, you guessed the number in {0} turns.", Turns);
    
        syncEvent.Set();
    },
    
    wfApp.Completed =
        Sub(e As WorkflowApplicationCompletedEventArgs)
            Dim Turns As Integer = Convert.ToInt32(e.Outputs("Turns"))
            Console.WriteLine("Congratulations, you guessed the number in {0} turns.", Turns)
    
            syncEvent.Set()
        End Sub
    

Yer işaretini sürdürmek için

  1. Mevcut AutoResetEvent bildiriminin hemen ardından, Main yönteminin en üstüne aşağıdaki kodu ekleyin.

    AutoResetEvent idleEvent = new AutoResetEvent(false);
    
    Dim idleEvent As New AutoResetEvent(False)
    
  2. aşağıdaki Idle işleyiciyi içindeki mevcut üç iş akışı yaşam döngüsü işleyicisinin Mainhemen altına ekleyin.

        Idle = delegate (WorkflowApplicationIdleEventArgs e)
        {
            idleEvent.Set();
        }
    };
    
    wfApp.Idle =
        Sub(e As WorkflowApplicationIdleEventArgs)
            idleEvent.Set()
        End Sub
    

    İş akışı bir sonraki tahmini beklerken her boşta kaldığında, bu işleyici çağrılır ve idleActionAutoResetEvent ayarlanır. Aşağıdaki adımdaki kod, idleEvent ve syncEvent kullanarak iş akışının bir sonraki tahmini bekleyip beklemediğini veya tamamlanıp tamamlanmadığını belirler.

    Not

    Bu örnekte konak uygulaması, iş akışının ilerleme durumuyla eşitlenmek için Completed ve Idle işleyicilerindeki otomatik sıfırlama olaylarını kullanır. Bir yer işaretine devam etmeden önce iş akışını engellemek ve onun boşta olmasını beklemek gerekmez. Ancak, bu örnekte, eşitleme olayları gereklidir ki bu sayede host, iş akışının tamamlanıp tamamlanmadığını veya Bookmark kullanarak daha fazla kullanıcı girişi bekleyip beklemediğini anlamalıdır. Daha fazla bilgi için bkz. Yer İşaretleri.

  3. WaitOne çağrısını kaldırın ve kullanıcıdan veri toplamak için kod ekleyin ve Bookmark'e devam edin.

    Aşağıdaki kod satırını kaldırın.

    syncEvent.WaitOne();
    
    syncEvent.WaitOne()
    

    Aşağıdaki örnekle değiştirin.

    // Loop until the workflow completes.
    WaitHandle[] handles = new WaitHandle[] { syncEvent, idleEvent };
    while (WaitHandle.WaitAny(handles) != 0)
    {
        // Gather the user input and resume the bookmark.
        bool validEntry = false;
        while (!validEntry)
        {
            if (!Int32.TryParse(Console.ReadLine(), out int Guess))
            {
                Console.WriteLine("Please enter an integer.");
            }
            else
            {
                validEntry = true;
                wfApp.ResumeBookmark("EnterGuess", Guess);
            }
        }
    }
    
    ' Loop until the workflow completes.
    Dim waitHandles As WaitHandle() = New WaitHandle() {syncEvent, idleEvent}
    Do While WaitHandle.WaitAny(waitHandles) <> 0
        'Gather the user input and resume the bookmark.
        Dim validEntry As Boolean = False
        Do While validEntry = False
            Dim Guess As Integer
            If Int32.TryParse(Console.ReadLine(), Guess) = False Then
                Console.WriteLine("Please enter an integer.")
            Else
                validEntry = True
                wfApp.ResumeBookmark("EnterGuess", Guess)
            End If
        Loop
    Loop
    

Uygulamayı oluşturmak ve çalıştırmak için

  1. Çözüm Gezgini'da NumberGuessWorkflowHost'a sağ tıklayın ve Başlangıç Projesi Olarak Ayarla'yı seçin.

  2. Uygulamayı derlemek ve çalıştırmak için CTRL+F5 tuşlarına basın. Mümkün olduğunca az dönüşte sayıyı tahmin etmeye çalışın.

    Uygulamayı diğer iş akışı stillerinden biriyle denemek için, WorkflowApplication oluşturma kodundaki Workflow1'yı, istediğiniz iş akışı stiline bağlı olarak, FlowchartNumberGuessWorkflow, SequentialNumberGuessWorkflow veya StateMachineNumberGuessWorkflow ile değiştirin.

    var inputs = new Dictionary<string, object>() { { "MaxNumber", 100 } };
    
    WorkflowApplication wfApp = new(_wf, inputs)
    {
    
    Dim inputs As New Dictionary(Of String, Object)
    inputs.Add("MaxNumber", 100)
    
    Dim wfApp As New WorkflowApplication(New Workflow1(), inputs)
    

    bir iş akışı uygulamasına kalıcılık ekleme hakkında yönergeler için, bir sonraki konu başlığı olan Nasıl yapılır: Uzun Süre Çalışan İş Akışı Oluşturma ve Çalıştırma konusuna bakın.

Örnek

Aşağıdaki örnek, yönteminin tam kod listesidir Main .

Not

Lütfen, önceki Nasıl Yapılır: İş Akışı Oluşturma adımında tamamladığınız iş akışına göre, bu örneklerdeki Workflow1 öğesini FlowchartNumberGuessWorkflow, SequentialNumberGuessWorkflow, veya StateMachineNumberGuessWorkflow ile değiştirin. Değiştirmezseniz Workflow1 , iş akışını derlemeyi veya çalıştırmayı denediğinizde derleme hataları alırsınız.

static void Main(string[] args)
{
    AutoResetEvent syncEvent = new AutoResetEvent(false);
    AutoResetEvent idleEvent = new AutoResetEvent(false);

    var inputs = new Dictionary<string, object>() { { "MaxNumber", 100 } };

    WorkflowApplication wfApp = new(_wf, inputs)
    {

        Completed = delegate (WorkflowApplicationCompletedEventArgs e)
        {
            int Turns = Convert.ToInt32(e.Outputs["Turns"]);
            Console.WriteLine("Congratulations, you guessed the number in {0} turns.", Turns);

            syncEvent.Set();
        },

        Aborted = delegate (WorkflowApplicationAbortedEventArgs e)
        {
            Console.WriteLine(e.Reason);
            syncEvent.Set();
        },

        OnUnhandledException = delegate (WorkflowApplicationUnhandledExceptionEventArgs e)
        {
            Console.WriteLine(e.UnhandledException.ToString());
            return UnhandledExceptionAction.Terminate;
        },

        Idle = delegate (WorkflowApplicationIdleEventArgs e)
        {
            idleEvent.Set();
        }
    };

    wfApp.Run();

    // Loop until the workflow completes.
    WaitHandle[] handles = new WaitHandle[] { syncEvent, idleEvent };
    while (WaitHandle.WaitAny(handles) != 0)
    {
        // Gather the user input and resume the bookmark.
        bool validEntry = false;
        while (!validEntry)
        {
            if (!Int32.TryParse(Console.ReadLine(), out int Guess))
            {
                Console.WriteLine("Please enter an integer.");
            }
            else
            {
                validEntry = true;
                wfApp.ResumeBookmark("EnterGuess", Guess);
            }
        }
    }
}
Sub Main()
    Dim syncEvent As New AutoResetEvent(False)
    Dim idleEvent As New AutoResetEvent(False)

    Dim inputs As New Dictionary(Of String, Object)
    inputs.Add("MaxNumber", 100)

    Dim wfApp As New WorkflowApplication(New Workflow1(), inputs)

    wfApp.Completed =
        Sub(e As WorkflowApplicationCompletedEventArgs)
            Dim Turns As Integer = Convert.ToInt32(e.Outputs("Turns"))
            Console.WriteLine("Congratulations, you guessed the number in {0} turns.", Turns)

            syncEvent.Set()
        End Sub

    wfApp.Aborted =
        Sub(e As WorkflowApplicationAbortedEventArgs)
            Console.WriteLine(e.Reason)
            syncEvent.Set()
        End Sub

    wfApp.OnUnhandledException =
        Function(e As WorkflowApplicationUnhandledExceptionEventArgs)
            Console.WriteLine(e.UnhandledException)
            Return UnhandledExceptionAction.Terminate
        End Function

    wfApp.Idle =
        Sub(e As WorkflowApplicationIdleEventArgs)
            idleEvent.Set()
        End Sub

    wfApp.Run()

    ' Loop until the workflow completes.
    Dim waitHandles As WaitHandle() = New WaitHandle() {syncEvent, idleEvent}
    Do While WaitHandle.WaitAny(waitHandles) <> 0
        'Gather the user input and resume the bookmark.
        Dim validEntry As Boolean = False
        Do While validEntry = False
            Dim Guess As Integer
            If Int32.TryParse(Console.ReadLine(), Guess) = False Then
                Console.WriteLine("Please enter an integer.")
            Else
                validEntry = True
                wfApp.ResumeBookmark("EnterGuess", Guess)
            End If
        Loop
    Loop
End Sub

Ayrıca bkz.