방법: 워크플로 실행
이 항목은 Windows Workflow Foundation 4에 적용됩니다.
이 항목은 Windows Workflow Foundation 초보자를 위한 자습서의 계속이며 이전 방법: 워크플로 만들기 항목에서 정의한 워크플로를 실행하는 방법을 설명합니다.
![]() |
---|
초보자를 위한 자습서의 각 항목은 이전 항목을 바탕으로 합니다. 이 항목을 진행하려면 먼저 방법: 활동 만들기 및 방법: 워크플로 만들기를 완료해야 합니다. |
워크플로 호스트 프로젝트를 열려면
Visual Studio 2010을 사용하여 이전 방법: 워크플로 만들기 항목의 솔루션을 엽니다.
솔루션 탐색기에서 Program.cs 또는 Module1.vb를 두 번 클릭하여 코드를 표시합니다.
팁:
솔루션 탐색기 창이 표시되어 있지 않으면 보기 메뉴에서 솔루션 탐색기를 선택합니다. 이 프로젝트는 워크플로 콘솔 응용 프로그램 템플릿을 사용하여 만들었기 때문에 Program.cs 또는 Module1.vb에는 다음과 같은 기본 워크플로 호스팅 코드가 포함됩니다.
WorkflowInvoker.Invoke(New Workflow1())
WorkflowInvoker.Invoke(new Workflow1());
생성된 이 호스팅 코드는 WorkflowInvoker를 사용합니다. WorkflowInvoker는 메서드 호출인 것처럼 워크플로를 호출하는 간단한 방법을 제공하며 지속성을 사용하지 않는 워크플로에만 사용할 수 있습니다. WorkflowApplication은 수명 주기 이벤트 알림, 실행 제어, 책갈피 다시 시작 및 지속성을 포함하는 워크플로를 실행하기 위한 다기능 모델을 제공합니다. 이 예제에서는 책갈피를 사용하며 WorkflowApplication을 사용하여 워크플로를 호스팅합니다. Program.cs 또는 Module1.vb 맨 위의 기존 using 또는 Imports 문 아래에 다음 using 또는 Imports 문을 추가합니다.
Imports System.Threading
using System.Threading;
WorkflowInvoker를 사용하는 코드 행을 다음과 같은 기본 WorkflowApplication 호스팅 코드로 바꿉니다. 이 샘플 호스팅 코드는 워크플로를 호스팅 및 호출하기 위한 기본 단계를 보여 주지만 이 항목에서 워크플로를 실행하는 기능은 아직 포함하고 있지 않습니다. 다음 단계에서는 응용 프로그램이 완료될 때까지 이 기본 코드를 수정하고 기능을 추가합니다.
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()
AutoResetEvent syncEvent = new AutoResetEvent(false); WorkflowApplication wfApp = new WorkflowApplication(new Workflow1()); 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();
이 코드는 WorkflowApplication을 만들고 세 가지 워크플로 수명 주기 이벤트를 구독한 다음 Run을 호출하여 워크플로를 시작하고 워크플로가 완료될 때까지 대기합니다. 워크플로가 완료되면 AutoResetEvent가 설정되고 호스트 응용 프로그램이 완료됩니다.
워크플로의 입력 인수를 설정하려면
Program.cs 또는 Module1.vb 맨 위의 기존 using 또는 Imports 문 아래에 다음 문을 추가합니다.
Imports System.Collections.Generic
using System.Collections.Generic;
새로운 WorkflowApplication을 만드는 코드 행을 코드 생성 시 매개 변수 사전을 만들어 워크플로에 전달하는 다음 코드로 바꿉니다.
Dim inputs As New Dictionary(Of String, Object) inputs.Add("MaxNumber", 100) Dim wfApp As New WorkflowApplication(New Workflow1(), inputs)
var inputs = new Dictionary<string, object>() { { "MaxNumber", 100 } }; WorkflowApplication wfApp = new WorkflowApplication(new Workflow1(), inputs);
이 사전에는
MaxNumber
키와 함께 요소 하나가 있습니다. 입력 사전의 키는 워크플로 루트 활동의 입력 인수에 해당합니다. 워크플로에서MaxNumber
를 사용하여 임의로 생성된 숫자의 상한을 결정합니다.
워크플로의 출력 인수를 검색하려면
Completed 처리기를 수정하여 워크플로에서 사용된 횟수를 검색하고 표시합니다.
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.Completed = delegate(WorkflowApplicationCompletedEventArgs e) { int Turns = Convert.ToInt32(e.Outputs["Turns"]); Console.WriteLine("Congratulations, you guessed the number in {0} turns.", Turns); syncEvent.Set(); };
책갈피를 다시 시작하려면
기존 AutoResetEvent 선언 바로 뒤
Main
메서드 위에 다음 코드를 추가합니다.Dim idleEvent As New AutoResetEvent(False)
AutoResetEvent idleEvent = new AutoResetEvent(false);
Main
에서 세 개의 기존 워크플로 수명 주기 처리기 바로 아래에 다음 Idle 처리기를 추가합니다.wfApp.Idle = _ Sub(e As WorkflowApplicationIdleEventArgs) idleEvent.Set() End Sub
wfApp.Idle = delegate(WorkflowApplicationIdleEventArgs e) { idleEvent.Set(); };
워크플로가 다음 추측을 대기하는 유휴 상태가 될 때마다 이 처리기가 호출되고
idleAction
AutoResetEvent가 설정됩니다. 다음 단계의 코드에서는idleEvent
와syncEvent
를 사용하여 워크플로가 다음 추측을 대기하고 있는지 아니면 완료되었는지를 확인합니다.참고:
이 예제에서는 호스트 응용 프로그램이 Completed 및 Idle 처리기에서 자동 재설정 이벤트를 사용하여 호스트 응용 프로그램을 워크플로 진행률과 동기화합니다. 책갈피를 다시 시작하기 전에 워크플로를 차단하고 워크플로가 유휴 상태가 될 때까지 기다릴 필요는 없지만, 이 예제에서는 호스트에서 워크플로가 완료되었는지 아니면 Bookmark를 사용하여 추가 사용자 입력을 대기하고 있는지 확인하기 위해 동기화 이벤트가 필요합니다. 자세한 내용은 다음 항목을 참조하십시오. 책갈피. WaitOne 호출을 제거한 다음, 사용자 입력을 수집하고 Bookmark를 다시 시작하는 코드로 대체합니다.
다음 코드 행을 제거합니다.
syncEvent.WaitOne()
syncEvent.WaitOne();
코드 행을 다음 예로 대체합니다.
' 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
// 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) { int Guess; if (!Int32.TryParse(Console.ReadLine(), out Guess)) { Console.WriteLine("Please enter an integer."); } else { validEntry = true; wfApp.ResumeBookmark("EnterGuess", Guess); } } }
응용 프로그램을 빌드하고 실행하려면
솔루션 탐색기에서 WorkflowConsoleApplication1을 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택합니다.
Ctrl+F5를 눌러 응용 프로그램을 빌드하고 실행합니다. 가능한 한 적은 횟수로 숫자를 추측해 봅니다.
워크플로 응용 프로그램에 지속성을 추가하는 방법은 다음 항목 방법: 장기 실행 워크플로 만들기 및 실행을 참조하십시오.
예제
다음 예는 Main
메서드에 대한 완전한 코드 목록입니다.
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
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 WorkflowApplication(new Workflow1(), inputs);
wfApp.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.Aborted = delegate(WorkflowApplicationAbortedEventArgs e)
{
Console.WriteLine(e.Reason);
syncEvent.Set();
};
wfApp.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs e)
{
Console.WriteLine(e.UnhandledException.ToString());
return UnhandledExceptionAction.Terminate;
};
wfApp.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)
{
int Guess;
if (!Int32.TryParse(Console.ReadLine(), out Guess))
{
Console.WriteLine("Please enter an integer.");
}
else
{
validEntry = true;
wfApp.ResumeBookmark("EnterGuess", Guess);
}
}
}
}
참고 항목
작업
방법: 워크플로 만들기
방법: 장기 실행 워크플로 만들기 및 실행
참조
기타 리소스
Windows Workflow Foundation 프로그래밍
초보자를 위한 자습서
워크플로에서 입력 대기
워크플로 호스팅