Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
С помощью локального хранилища потока (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 действия.