다음을 통해 공유


방법: 장기 실행 워크플로 만들기 및 실행

이 항목은 Windows Workflow Foundation 4에 적용됩니다.

Windows WF(Workflow Foundation)의 핵심 기능 중 하나는 런타임 시 데이터베이스에 유휴 워크플로를 유지하고 언로드하는 기능입니다. 이 항목에서는 워크플로 유지를 위한 로컬 데이터베이스를 만드는 방법과 워크플로 응용 프로그램에서 지속성을 사용하는 방법을 보여 줍니다.

Dd489452.note(ko-kr,VS.100).gif참고:
초보자를 위한 자습서의 각 항목은 이전 항목을 바탕으로 합니다. 이 항목을 진행하려면 먼저 방법: 활동 만들기, 방법: 워크플로 만들기방법: 워크플로 실행을 완료해야 합니다.

지속성 데이터베이스를 만들려면

  1. SQL Server Management Studio를 열고 로컬 서버에 연결합니다. 로컬 서버에서 데이터베이스 노드를 마우스 오른쪽 단추로 클릭하고 새 데이터베이스를 선택합니다. 새 데이터베이스 이름을 Persistence로 지정한 다음 다른 값은 모두 그대로 두고 확인을 선택합니다

    Dd489452.note(ko-kr,VS.100).gif참고:
    새 데이터베이스를 만들기 전에 로컬 서버에 대한 데이터베이스 만들기 권한이 자신에게 있는지 확인해야 합니다.

  2. Persistence 데이터베이스를 마우스 오른쪽 단추로 클릭하고 새 쿼리를 선택합니다. C:\Windows\Microsoft.NET\Framework\<current version>\sql\en 폴더를 엽니다. 다음 파일을 쿼리 창으로 끌어 놓고 다음 순서로 실행합니다.

    • SqlWorkflowInstanceStoreSchema.sql

    • SqlWorkflowInstanceStoreLogic.sql

워크플로 응용 프로그램에서 지속성을 사용하려면

  1. 솔루션 탐색기에서 WorkflowConsoleApplication1을 마우스 오른쪽 단추로 클릭하고 참조 추가를 선택합니다.

  2. .NET 탭에서 System.Activities.DurableInstancingSystem.Runtime.DurableInstancing을 선택하고 확인을 클릭합니다.

  3. WorkflowConsoleApplication1 프로젝트에서 Program.cs(Visual Basic의 경우 Module1.vb)를 엽니다. 첫째 단계에서 만든 지속성 데이터베이스에 대한 연결 문자열을 정의하는 문자열 상수를 Program 클래스(Visual Basic의 경우 Module1)에서 선언합니다.

    Const connectionString As String = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI"
    
    const string connectionString = "Server=.\\SQLEXPRESS;Initial Catalog=Persistence;Integrated Security=SSPI";
    
    Dd489452.note(ko-kr,VS.100).gif참고:
    SQL Server 에디션에 따라 연결 문자열 서버 이름이 다를 수 있습니다.

  4. 이번에는 System.Activities.DurableInstancing에 대한 using 또는 Imports 문을 Program.cs 또는 Module1.vb 파일에 추가합니다.

    Imports System.Activities.DurableInstancing
    
    using System.Activities.DurableInstancing;
    
  5. WorkflowApplication을 만드는 코드 다음의 Main 메서드에서 SqlWorkflowInstanceStore를 만들고 WorkflowApplicationInstanceStore에 할당합니다.

    Dim inputs As New Dictionary(Of String, Object)
    inputs.Add("MaxNumber", 100)
    
    Dim wfApp As New WorkflowApplication(New Workflow1(), inputs)
    
    Dim store As New SqlWorkflowInstanceStore(connectionString)
    wfApp.InstanceStore = store
    
    WorkflowApplication wfApp =
        new WorkflowApplication(new Workflow1(), inputs);
    
    SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString);
    wfApp.InstanceStore = store;
    
  6. 다음에는 유휴 상태가 될 때 유지할 워크플로를 지정합니다. 이렇게 하려면 PersistableIdle을 처리하는 다음 코드를 이전 항목에서 추가한 Idle 이벤트의 대리자 대신 사용합니다.

    ' Replace the Idle handler with a PersistableIdle handler.
    'wfApp.Idle = _
    '    Sub(e As WorkflowApplicationIdleEventArgs)
    '        idleEvent.Set()
    '    End Sub
    
    wfApp.PersistableIdle = _
        Function(e As WorkflowApplicationIdleEventArgs)
            idleEvent.Set()
            Return PersistableIdleAction.Persist
        End Function
    
    // Replace the Idle handler with a PersistableIdle handler.
    //wfApp.Idle = delegate(WorkflowApplicationIdleEventArgs e)
    //{
    //    idleEvent.Set();
    //};
    
    wfApp.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs e)
    {
        idleEvent.Set();
        return PersistableIdleAction.Persist;
    };
    
    Dd489452.note(ko-kr,VS.100).gif참고:
    PersistableIdleAction 열거형에는 None, PersistUnload라는 세 가지 값이 있습니다. Persist를 사용하면 워크플로가 유지되지만 언로드되지는 않습니다. Unload를 사용해야 워크플로가 유지되고 언로드됩니다. 인스턴스가 언로드되면 WorkflowApplication이 삭제되므로 다음에 언로드된 워크플로와 상호 작용하려면 새 WorkflowApplication 개체가 필요합니다. 이 항목에서는 워크플로가 메모리에 유지되고 WorkflowApplication이 삭제되지 않도록 Persist를 사용합니다. Unload 열거형 값과 함께 WorkflowApplication을 사용하는 예는 워크플로 응용 프로그램 유지 샘플을 참조하십시오.

  7. Main 메서드의 끝에 다음 코드 행을 추가합니다. WorkflowApplication은 게임이 완료되고 지속성 레코드를 데이터베이스에서 제거한 후 메모리에서 워크플로 인스턴스를 자동으로 언로드합니다.

    Console.WriteLine("Press any key to continue . . .")
    Console.ReadKey()
    
    Console.WriteLine("Press any key to continue . . .");
    Console.ReadKey();
    
    Dd489452.note(ko-kr,VS.100).gif참고:
    워크플로가 완료되면 워크플로에 대한 지속성 레코드가 제거됩니다. Console.ReadKey를 사용하지 않는 이 예제에서는 워크플로가 완료되는 즉시 호스트 응용 프로그램이 종료됩니다. 지속성 정리는 백그라운드 스레드에서 이루어지기 때문에 정리가 완료되기 전에 호스트가 종료되면 정리 작업이 완료될 수 없습니다. 지속성 작업이 완료되기 전에 호스트가 종료되지 않도록 하는 다른 방법은 워크플로가 완료된 후 Unloaded 이벤트가 발생할 때까지 호스트를 차단하는 것입니다. 워크플로가 완료된 후 완료된 워크플로를 지속성으로부터 제거하는 등과 같은 백그라운드 작업이 끝날 때까지 해당 워크플로가 언로드되지 않습니다.

  8. 지속성을 테스트하려면 F5 키를 눌러 응용 프로그램을 시작하고 SQL Server Management Studio로 다시 전환합니다. Persistence 데이터베이스 노드(또는 Master 데이터베이스에 지속성 테이블을 만든 경우 Master 데이터베이스 노드)를 확장하고 Persistence 데이터베이스 내의 Tables 노드를 확장합니다. InstancesTable 테이블을 마우스 오른쪽 단추로 클릭하고 상위 1000개의 행 선택을 선택합니다. 유지된 워크플로의 워크플로 ID와 함께 행 하나가 표시되어야 합니다.

    이제 끝까지 진행하여 워크플로를 완료합니다. 작업이 종료되면 SQL Server Management Studio로 돌아가서 쿼리를 다시 실행합니다. 지속성 레코드는 반환되지 않습니다.

    이것으로 초보자를 위한 자습서를 완료했습니다.