Свойства выполнения рабочего процессаWorkflow Execution Properties

Через локальную память потока (TLS) CLR поддерживает контекст выполнения для каждого потока.Through thread local storage (TLS), the CLR maintains an execution context for each thread. Этот контекст выполнения управляет хорошо известными свойствами потоков, например идентификатором потока, внешней транзакцией и текущим набором разрешений, а также пользовательскими свойствами потока, например именованными областями.This execution context governs well-known thread properties such as the thread identity, the ambient transaction, and the current permission set in addition to user-defined thread properties like named slots.

В отличие от программ, предназначенных для непосредственной работы в среде CLR, программы рабочих процессов представляют иерархические деревья действий, которые выполняются в среде, не поддерживающей разделение на потоки.Unlike programs directly targeting the CLR, workflow programs are hierarchically scoped trees of activities that execute in a thread-agnostic environment. Это предполагает, что с помощью стандартных механизмов TLS нельзя непосредственно определить, какой контекст находится в области для данного рабочего элемента.This implies that the standard TLS mechanisms cannot directly be used to determine what context is in scope for a given work item. Например, две параллельные ветви выполнения могут использовать различные транзакции, но планировщик может чередовать их выполнение в одном потоке CLR.For example, two parallel branches of execution might use different transactions, yet the scheduler might interleave their execution on the same CLR thread.

Свойства выполнения рабочего процесса предоставляют механизм добавления определенных свойств контекста к среде действия.Workflow execution properties provide a mechanism to add context specific properties to an activity’s environment. Это позволяет действию объявлять, какие свойства находятся в области для его поддерева, а также предоставлять обработчики для установки или удаления TLS в целях правильного взаимодействия с объектами CLR.This allows an activity to declare which properties are in scope for its sub-tree and also provides hooks for setting up and tearing down TLS to properly interoperate with CLR objects.

Создание и использование свойств выполнения рабочего процессаCreating and Using Workflow Execution Properties

Свойства выполнения рабочего процесса обычно реализуют интерфейс IExecutionProperty, хотя свойства, сфокусированные на обмене сообщениями, могут вместо этого реализовать ISendMessageCallback и IReceiveMessageCallback.Workflow execution properties usually implement the IExecutionProperty interface, though properties focused on messaging may implement ISendMessageCallback and IReceiveMessageCallback instead. Чтобы создать свойство выполнения рабочего процесса, создайте класс, который реализует интерфейс IExecutionProperty, а также реализует элементы SetupWorkflowThread и CleanupWorkflowThread.To create a workflow execution property, create a class that implements the IExecutionProperty interface and implement the members SetupWorkflowThread and CleanupWorkflowThread. Эти элементы обеспечивают для свойства выполнения возможность правильной настройки локального хранилища потока на всех этапах выполнения действия, которое содержит свойство, включая все дочерние свойства.These members provide the execution property with an opportunity to properly set up and tear down the thread local storage during each pulse of work of the activity that contains the property, including any child activities. В этом примере создается ConsoleColorProperty, который задает Console.ForegroundColor.In this example, a ConsoleColorProperty is created that sets the 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;  
    }  
}  

Создатели действия могут использовать это свойство путем его регистрации в операции переопределения выполнения действия.Activity authors can use this property by registering it in the activity’s execute override. В этом примере определяется действие ConsoleColorScope, которое регистрирует свойство ConsoleColorProperty путем его добавления к коллекции Properties текущего контекста NativeActivityContext.In this example, a ConsoleColorScope activity is defined that registers the ConsoleColorProperty by adding it to the Properties collection of the current NativeActivityContext.

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.When the activity’s body starts a pulse of work, the SetupWorkflowThread method of the property is called, and when the pulse of work is complete, the CleanupWorkflowThread is called. В этом примере создается рабочий процесс, который использует действие Parallel с тремя ветвями.In this example, a workflow is created that uses a Parallel activity with three branches. В первых двух ветвях используется действие ConsoleColorScope, а в третьей - нет.The first two branches use the ConsoleColorScope activity and the third branch does not. Все три ветви содержат два действия WriteLine и действие Delay.All three branches contain two WriteLine activities and a Delay activity. При выполнении действия Parallel те действия, которые содержатся в ветвях, выполняются с чередованием, но при выполнении каждого дочернего действия свойство ConsoleColorProperty применяет правильный цвет консоли.When the Parallel activity executes, the activities that are contained in the branches execute in an interleaved manner, but as each child activity executes the correct console color is applied by the 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);  

При вызове рабочего процесса в окне консоли записываются следующие выходные данные.When the workflow is invoked, the following output is written to the console window.

Start blue text.  
Start red text.  
Start default text.  
End blue text.  
End red text.  
End default text.  

Примечание

Хотя это не показано в предшествующих выходных данных, все строки текста в окне консоли отображаются с использованием указанного цвета.Although it is not shown in the previous output, each line of text in the console window is displayed in the indicated color.

Создатели настраиваемого действия могут использовать свойства выполнения рабочего процесса, а также предоставлять механизм управления обработкой для таких действий, как CorrelationScope и TransactionScope.Workflow execution properties can be used by custom activity authors, and they also provide the mechanism for handle management for activities such as the CorrelationScope and TransactionScope activities.

См. такжеSee also