Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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
Visual Studio 2012 kullanarak önceki Nasıl yapılır: Etkinlik oluşturma konusunun çözümünü açın.
Çö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.
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
NumberGuessWorkflowHostve 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.Çö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.
Çö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
Çö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.
usingifadesini, mevcut using veya Imports deyimlerinin altına Program.cs veya Module1.vb'nin en üstüne ekleyin.Imports NumberGuessWorkflowActivities Imports System.Threadingusing 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öğesiniFlowchartNumberGuessWorkflow,SequentialNumberGuessWorkflowveyaStateMachineNumberGuessWorkflowile değiştirmeniz gerekir. DeğiştirmezsenizWorkflow1, 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
Var olan
usingveyaImportsdeyimlerinin altına Program.cs veya Module1.vb dosyasının en üstüne aşağıdaki deyimi ekleyin.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öğesiniFlowchartNumberGuessWorkflow,SequentialNumberGuessWorkflow, veyaStateMachineNumberGuessWorkflowile değiştirin. DeğiştirmezsenizWorkflow1, 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.MaxNumberiş 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
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
Mevcut AutoResetEvent bildiriminin hemen ardından,
Mainyönteminin en üstüne aşağıdaki kodu ekleyin.AutoResetEvent idleEvent = new AutoResetEvent(false);Dim idleEvent As New AutoResetEvent(False)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,idleEventvesyncEventkullanarak 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.
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
Çözüm Gezgini'da NumberGuessWorkflowHost'a sağ tıklayın ve Başlangıç Projesi Olarak Ayarla'yı seçin.
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,SequentialNumberGuessWorkflowveyaStateMachineNumberGuessWorkflowile 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