Поделиться через


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

С помощью локального хранилища потока (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 действия.

См. также