다음을 통해 공유


워크플로 실행 속성

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

CLR은 TLS(스레드 로컬 저장소)를 통해 각 스레드의 실행 컨텍스트를 유지 관리합니다. 이 실행 컨텍스트는 스레드 ID, 앰비언트 트랜잭션 및 현재 권한 집합과 같은 잘 알려진 스레드 속성은 물론 명명된 슬롯과 같은 사용자 정의 스레드 속성을 제어합니다.

CLR을 직접 대상으로 하는 프로그램과 달리 워크플로 프로그램은 스레드를 알 수 없는 환경에서 실행되는 계층적 범위의 활동 트리입니다. 따라서 표준 TLS 메커니즘을 직접 사용하여 제공된 작업 항목 범위의 컨텍스트를 확인할 수 없습니다. 예를 들어 두 개의 병렬 실행 분기는 서로 다른 트랜잭션을 사용할 수 있지만 스케줄러는 동일한 CLR 스레드에서 해당 실행을 인터리브할 수 있습니다.

워크플로 실행 속성은 활동 환경에 컨텍스트별 속성을 추가하는 메커니즘을 제공합니다. 이 실행 속성을 통해 활동에서 해당 하위 트리 범위의 속성을 선언할 수 있을 뿐 아니라 CLR 개체와의 적절한 상호 작용을 위해 TLS를 설정 및 중지하는 후크를 제공할 수 있습니다.

워크플로 실행 속성 만들기 및 사용

워크플로 실행 속성은 IExecutionProperty 인터페이스를 구현합니다. 워크플로 실행 속성을 만들려면 IExecutionProperty 인터페이스를 구현하는 클래스를 만들고 멤버 SetupWorkflowThreadCleanupWorkflowThread를 구현합니다. 이 멤버는 자식 활동을 비롯하여 속성이 포함된 활동의 각 작업 펄스 중 스레드 로컬 저장소를 올바르게 설정하고 중지할 기회를 실행 속성에 제공합니다. 이 예제에서는 Console.ForegroundColor를 설정하는 ConsoleColorProperty를 만듭니다.

Ee358743.note(ko-kr,VS.100).gif참고:
이 항목의 다음 예제 코드는 실행 속성 샘플을 기반으로 합니다.

class ConsoleColorProperty : IExecutionProperty
{
    public const string Name = "ConsoleColorProperty";

    ConsoleColor original;
    ConsoleColor color;

    public ConsoleColorProperty(ConsoleColor color)
    {
        this.color = color;
    }

    void IExecutionProperty.SetupWorkflowThread()
    {
        original = Console.ForegroundColor;
        Console.ForegroundColor = color;
    }

    void IExecutionProperty.CleanupWorkflowThread()
    {
        Console.ForegroundColor = original;
    }
}

활동 작성자는 활동 실행 재정의에 이 속성을 등록하여 속성을 사용할 수 있습니다. 이 예제에서는 ConsoleColorProperty를 현재 NativeActivityContextProperties 컬렉션에 추가하여 등록하는 ConsoleColorScope 활동을 정의합니다.

public sealed class ConsoleColorScope : NativeActivity
{
    public ConsoleColorScope()
        : base()
    {
    }

    public ConsoleColor Color { get; set; }
    public Activity Body { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        context.Properties.Add(ConsoleColorProperty.Name, new ConsoleColorProperty(this.Color));

        if (this.Body != null)
        {
            context.ScheduleActivity(this.Body);
        }
    }
}

활동 본문이 작업 펄스를 시작하면 속성의 SetupWorkflowThread 메서드가 호출되고 작업 펄스가 완료되면 CleanupWorkflowThread가 호출됩니다. 이 예제에서는 세 분기가 있는 Parallel 활동을 사용하여 워크플로를 만듭니다. 처음 두 분기는 ConsoleColorScope 활동을 사용하고 세 번째 분기는 이 활동을 사용하지 않습니다. 세 분기에는 모두 WriteLine 활동 두 개와 Delay 활동 하나가 포함됩니다. Parallel 활동이 실행되면 분기에 포함된 활동이 인터리브 방식으로 실행되지만, 각 자식 활동이 실행되면 ConsoleColorProperty에서 올바른 콘솔 색상이 적용됩니다.

Activity wf = new Parallel
{
    Branches = 
    {
        new ConsoleColorScope
        {
            Color = ConsoleColor.Blue,
            Body = new Sequence
            {
                Activities = 
                {
                    new WriteLine
                    {
                        Text = "Start blue text."
                    },
                    new Delay
                    {
                        Duration = TimeSpan.FromSeconds(1)
                    },
                    new WriteLine
                    {
                        Text = "End blue text."
                    }
                }
            }
        },
        new ConsoleColorScope
        {
            Color = ConsoleColor.Red,
            Body = new Sequence
            {
                Activities = 
                {
                    new WriteLine
                    {
                        Text = "Start red text."
                    },
                    new Delay
                    {
                        Duration = TimeSpan.FromSeconds(1)
                    },
                    new WriteLine
                    {
                        Text = "End red text."
                    }
                }
            }
        },
        new Sequence
        {
            Activities = 
            {
                new WriteLine
                {
                    Text = "Start default text."
                },
                new Delay
                {
                    Duration = TimeSpan.FromSeconds(1)
                },
                new WriteLine
                {
                    Text = "End default text."
                }
            }
        }
    }
};

WorkflowInvoker.Invoke(wf);

워크플로가 호출되면 다음 출력이 콘솔 창에 기록됩니다.

Start blue text.
Start red text.
Start default text.
End blue text.
End red text.
End default text.
Ee358743.note(ko-kr,VS.100).gif참고:
이전 출력에는 표시되지 않았지만 콘솔 창의 각 텍스트 행은 지정된 색상으로 표시됩니다.

워크플로 실행 속성은 사용자 지정 활동 작성자가 사용할 수 있으며, CorrelationScopeTransactionScope 활동과 같은 활동의 처리 관리 메커니즘도 제공합니다.

참고 항목

참조

IExecutionProperty
IPropertyRegistrationCallback
RegistrationContext