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

С помощью локального хранилища потока (TLS) среда CLR поддерживает контекст выполнения для каждого потока. Этот контекст выполнения управляет известными свойствами потока, такими как удостоверение потока, окружающая транзакция и текущий набор разрешений, а также пользовательские свойства потока, такие как именованные слоты.

В отличие от программ, непосредственно нацеленных на CLR, программы рабочих процессов представляют собой иерархически структурированные деревья действий, выполняемых в среде, независимой от потоков. Это означает, что стандартные механизмы TLS нельзя напрямую использовать для определения, какой контекст находится в действующей области для определённого рабочего элемента. Например, две параллельные ветви выполнения могут использовать разные транзакции, но планировщик может чередовать их выполнение в одном потоке CLR.

Свойства выполнения рабочего процесса предоставляют механизм добавления контекстных свойств в среду действия. Это позволяет действию объявлять, какие свойства находятся в области его поддерева, а также предоставляет перехватчики для настройки и удаления TLS для правильного взаимодействия с объектами CLR.

Создание и использование свойств выполнения рабочего процесса

Свойства выполнения рабочего процесса обычно реализуют интерфейс IExecutionProperty, хотя свойства, ориентированные на обмен сообщениями, могут реализовать ISendMessageCallback и IReceiveMessageCallback вместо этого. Чтобы создать свойство выполнения процесса, создайте класс, который реализует интерфейс 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, добавляя его в коллекцию Properties текущего 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. В этом примере создается рабочий процесс, использующий 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 действия.

См. также