다음을 통해 공유


워크플로 실행 속성

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

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

워크플로 실행 속성은 작업 환경에 컨텍스트별 속성을 추가하는 메커니즘을 제공합니다. 이를 통해 활동은 하위 트리의 범위에 있는 속성을 선언할 수 있으며, CLR 개체와 제대로 상호 운용하기 위해 TLS를 설정하고 분해하기 위한 후크를 제공합니다.

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

일반적으로 워크플로 실행 속성은 IExecutionProperty 인터페이스를 구현하지만, 메시징에 초점을 맞춘 속성은 대신 ISendMessageCallbackIReceiveMessageCallback 인터페이스를 구현할 수 있습니다. 워크플로 실행 속성을 만들려면 인터페이스를 구현하는 클래스를 IExecutionProperty 만들고 멤버 SetupWorkflowThread 를 구현합니다 CleanupWorkflowThread. 이러한 멤버는 자식 활동을 포함하여 속성이 포함된 작업의 각 펄스 동안 스레드 로컬 스토리지를 올바르게 설정하고 분해할 수 있는 기회를 실행 속성에 제공합니다. 이 예제에서는 ConsoleColorProperty를 생성해 Console.ForegroundColor을 설정합니다.

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;  
    }  
}  

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

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.  

비고

이전 출력에는 표시되지 않았지만 콘솔 창의 각 텍스트 줄은 표시된 색으로 표시됩니다.

워크플로 실행 속성은 사용자 지정 활동 작성자가 사용할 수 있으며 활동과 CorrelationScope 같은 TransactionScope 활동에 대한 핸들 관리 메커니즘도 제공합니다.

참고하십시오