다음을 통해 공유


Windows Workflow 아키텍처

Windows WF(Workflow Foundation)는 대화형 장기 실행 애플리케이션 개발을 위한 추상화 수준을 높입니다. 작업 단위는 활동으로 캡슐화됩니다. 또한 활동은 흐름 제어, 예외 처리, 오류 전파, 상태 데이터 지속성, 메모리에서 진행 중인 워크플로 로드 및 언로드, 추적, 트랜잭션 흐름 등과 같은 기능을 제공하는 환경에서 실행됩니다.

활동 아키텍처

활동은 Activity, CodeActivity, AsyncCodeActivity 또는 NativeActivity에서 파생되는 CLR 형식 또는 Activity<TResult>, CodeActivity<TResult>, AsyncCodeActivity<TResult> 또는 NativeActivity<TResult> 값을 반환하는 변형으로 개발됩니다. Activity에서 파생되는 개발 활동을 사용하면 기존 활동을 어셈블하여 워크플로 환경에서 실행되는 작업 단위를 신속하게 만들 수 있습니다. 반면 CodeActivity를 사용하면 주로 CodeActivityContext를 통해 관리 코드에서 활동 인수에 액세스하는 데 필요한 실행 논리를 작성할 수 있습니다. AsyncCodeActivity는 비동기 작업을 구현하는 데 사용할 수 있다는 점을 제외하고 CodeActivity와 비슷합니다. NativeActivity에서 파생되는 활동을 개발하면 자식 예약, 책갈피 만들기, 비동기 작업 호출, 트랜잭션 등록 등과 같은 기능에 NativeActivityContext를 통해 런타임에 액세스할 수 있습니다.

Activity에서 파생되는 작성 활동은 선언적이며 XAML로 작성될 수 있습니다. 다음 예제에서는 실행 본문에 다른 활동을 사용하여 Prompt라는 활동을 만듭니다.

<Activity x:Class='Prompt'  
  xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'  
    xmlns:z='http://schemas.microsoft.com/netfx/2008/xaml/schema'  
xmlns:my='clr-namespace:XAMLActivityDefinition;assembly=XAMLActivityDefinition'  
xmlns:s="clr-namespace:System;assembly=mscorlib"  
xmlns="http://schemas.microsoft.com/2009/workflow">  
<z:SchemaType.Members>  
  <z:SchemaType.SchemaProperty Name='Text' Type='InArgument(s:String)' />  
  <z:SchemaType.SchemaProperty Name='Response' Type='OutArgument(s:String)' />  
</z:SchemaType.Members>  
  <Sequence>  
    <my:WriteLine Text='[Text]' />  
    <my:ReadLine BookmarkName='r1' Result='[Response]' />  
  </Sequence>  
</Activity>  

활동 컨텍스트

ActivityContext는 워크플로 런타임에 대한 활동 작성자 인터페이스이며 풍부한 런타임 기능에 대한 액세스를 제공합니다. 다음 예제에서는 실행 컨텍스트를 사용하여 책갈피를 만드는 데 사용하는 활동을 정의합니다. 책갈피는 활동 실행 중에 호스트에서 데이터를 활동에 전달하기 위해 다시 시작할 수 있는 연속 지점을 등록할 수 있는 메커니즘입니다.

public sealed class ReadLine : NativeActivity<string>
{
    [RequiredArgument]
    public InArgument<string> BookmarkName { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        // Create a Bookmark and wait for it to be resumed.
        context.CreateBookmark(BookmarkName.Get(context),
            new BookmarkCallback(OnResumeBookmark));
    }

    // NativeActivity derived activities that do asynchronous operations by calling
    // one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext
    // must override the CanInduceIdle property and return true.
    protected override bool CanInduceIdle
    {
        get { return true; }
    }

    public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj)
    {
        // When the Bookmark is resumed, assign its value to
        // the Result argument.
        Result.Set(context, (string)obj);
    }

활동 수명 주기

활동 인스턴스는 Executing 상태에서 시작합니다. 예외가 발생하지 않는 한 실행 중인 모든 자식 활동과 보류 중인 다른 작업(예: Bookmark 개체)을 마칠 때까지는 활동 인스턴스가 이 상태로 유지됩니다. 이러한 활동이 완료되면 Closed 상태로 전환됩니다. 활동 인스턴스의 부모가 자식을 취소하도록 요청할 수 있습니다. 자식을 취소할 수 있으면 Canceled 상태로 완료됩니다. 실행 중에 예외가 throw되면 런타임에 활동이 Faulted 상태로 전환되고 예외가 활동의 부모 체인으로 전파됩니다. 다음은 작업의 세 가지 완료 상태입니다.

  • Closed: 작업을 완료한 후 종료했습니다.

  • Canceled: 작업을 정상적으로 중단한 후 종료했습니다. 이 상태로 전환될 경우 작업이 명시적으로 롤백되지 않습니다.

  • Faulted: 작업 중에 오류가 발생하여 작업을 완료하지 않고 종료했습니다.

활동이 지속되거나 언로드되는 경우에는 Executing 상태로 유지됩니다.