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
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 Gezgini seç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çı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.Çö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.
Çö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
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 ,
SequentialNumberGuessWorkflow
veyaStateMachineNumberGuessWorkflow
ileFlowchartNumberGuessWorkflow
değiştirmenizWorkflow1
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 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
Var olan veya
Imports
deyimlerinin altına Program.cs veya Module1.vb en üstüne aşağıdaki deyimiusing
ekleyin.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 ,
SequentialNumberGuessWorkflow
veyaStateMachineNumberGuessWorkflow
ileFlowchartNumberGuessWorkflow
değiştirinWorkflow1
. 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
MaxNumber
sahip 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
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
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)
aşağıdaki Idle işleyiciyi içindeki mevcut üç iş akışı yaşam döngüsü işleyicisinin
Main
hemen 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 vesyncEvent
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.
çağrısı
WaitOne
kaldı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
Çö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, istediğiniz iş akışı stiline bağlı olarak ,
SequentialNumberGuessWorkflow
veyaStateMachineNumberGuessWorkflow
ileFlowchartNumberGuessWorkflow
oluş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 , SequentialNumberGuessWorkflow
veya StateMachineNumberGuessWorkflow
ile FlowchartNumberGuessWorkflow
değ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