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ışı konak 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 Gezgini seç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çılan listesinde .NET Framework 4.5'in seçildiğinden 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'da yeni eklenen NumberGuessWorkflowHost projesine sağ tıklayın ve Başvuru Ekle'yi seçin. Başvuru Ekle listesinden Çözüm'e tıklayın, 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. Kodu görüntülemek için Çözüm Gezgini Program.cs veya Module1.vb çift tıklayın.

    İpucu

    Çözüm Gezgini penceresi görüntülenmiyorsa Görünüm menüsünden Çözüm Gezgini seç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);
    

    Oluşturulan bu barındırma kodu kullanır WorkflowInvoker. 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ı, yürütme denetimi, yer işareti yeniden başlatma ve kalıcılık bildirimini 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 aşağıdaki veya imports deyimini Program.cs veya Module1.vb altındaki using veya Imports deyimlerinin altına 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 Nasıl yapılır: İş Akışı Oluşturma adımında hangi iş akışını tamamladığınıza bağlı olarak, bu örneklerde öğesini , SequentialNumberGuessWorkflowveya StateMachineNumberGuessWorkflowile FlowchartNumberGuessWorkflowdeğiştirmeniz Workflow1 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 WorkflowApplicationoluşturur, üç iş akışı yaşam döngüsü olayına abone olur, çağrısıyla Runiş akışını başlatır ve ardından iş akışının tamamlanmasını bekler. İş akışı tamamlandığında ayarlanır AutoResetEvent ve konak uygulaması tamamlanır.

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

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

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

    Not

    Lütfen önceki Nasıl yapılır: İş Akışı Oluşturma adımında hangi iş akışını tamamladığınıza bağlı olarak, bu örneklerde öğesini , SequentialNumberGuessWorkflowveya StateMachineNumberGuessWorkflowile FlowchartNumberGuessWorkflowdeğiştirinWorkflow1. 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 etkinliğindeki 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 için

  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. Aşağıdaki kodu, mevcut AutoResetEvent bildirimin Main hemen arkasına yönteminin en üstüne 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 idleAction AutoResetEvent ve ayarlanır. Aşağıdaki adımdaki kod, iş akışının bir sonraki tahmini mi beklediğini yoksa tamamlanıp tamamlanmadığını belirlemek için ve syncEvent kullanıridleEvent.

    Not

    Bu örnekte konak uygulaması, konak uygulamasını iş akışının Completed ilerleme durumuyla eşitlemek için ve Idle işleyicilerindeki otomatik sıfırlama olaylarını kullanır. Bir yer işaretine devam etmeden önce iş akışının engellenmesi ve boşta olmasını beklemek gerekmez, ancak bu örnekte eşitleme olayları gereklidir, böylece konak iş akışının tamamlanıp tamamlanmadığını veya kullanarak Bookmarkdaha fazla kullanıcı girişi bekleyip beklemediğini anlayabilir. Daha fazla bilgi için bkz . Yer İşaretleri.

  3. çağrısı WaitOnekaldırın ve kullanıcıdan giriş toplamak ve devam ettirmek Bookmarkiçin öğesini kodla değiştirin.

    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ı derlemek 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, istediğiniz iş akışı stiline bağlı olarak , SequentialNumberGuessWorkflowveya StateMachineNumberGuessWorkflowile FlowchartNumberGuessWorkflowoluşturan WorkflowApplication kodu değiştirinWorkflow1.

    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 hangi iş akışını tamamladığınıza bağlı olarak, bu örneklerde öğesini , SequentialNumberGuessWorkflowveya StateMachineNumberGuessWorkflowile FlowchartNumberGuessWorkflowdeğiştirinWorkflow1. 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.