Архитектура рабочих процессов Windows
Данный раздел относится к версии Windows Workflow Foundation 4.
Windows Workflow Foundation (WF) поднимает уровень абстракции для разработки интерактивных длительных приложений. Блоки обработки инкапсулируются в виде действий. Действия работают в среде, которая обеспечивает средства для управления потоком, обработки исключений, распространения ошибок, сохранения данных состояния, загрузки и выгрузки текущих рабочих процессов из памяти, отслеживания и управления потоком транзакций.
Архитектура действий
Действия разрабатываются в виде типов среды CLR, которые являются либо производными от Activity, CodeActivity или NativeActivity или от их вариантов, возвращающих значение Activity, CodeActivity или NativeActivity. Разработка действий, которые являются производными от действия Activity, позволяет пользователю собирать существующие объекты WorkflowElement для быстрого создания блоков обработки, работающих в среде рабочих процессов. С другой стороны, действие CodeActivity позволяет создавать логику выполнения в управляемом коде с использованием CodeActivityContext в основном для доступа к аргументам действий. Разработка действий, которые являются производными от действия NativeActivity, позволяет пользователям получать доступ к среде выполнения посредством метода ActivityExecutionContext для таких функций, как планирование дочерних объектов, создание закладок, вызов асинхронной работы, регистрации транзакций и других операций.
Создание действий, которые происходят от действия Activity, является декларативным, при этом эти действия не могут быть созданы на языке XAML. В следующем примере действие Prompt
создается при помощи других действий для тела выполнения.
<Activity x:Class='Prompt'
xmlns:x='https://schemas.microsoft.com/winfx/2006/xaml'
xmlns:z='https://schemas.microsoft.com/netfx/2008/xaml/schema'
xmlns:my='clr-namespace:XAMLActivityDefinition;assembly=XAMLActivityDefinition'
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns="https://schemas.microsoft.com/2009/workflow">
<z:SchemaType.Members>
<z:SchemaType.SchemaProperty Name='Text' Type=' InArgument(s:String)' />
<z:SchemaType.SchemaProperty Name='Response' Type='OutArgument(s:String)' />
</z:SchemaType.Members>
<Sequence>
<my:WriteLine Text='[Text]' />
<my:ReadLine Bookmark='r1' Result='[Response]' />
</Sequence>
</Activity>
Контекст выполнения действия
ActivityExecutionContext представляет собой интерфейс автора действий со средой выполнения рабочих процессов и обеспечивает доступ ко многим функциям среды выполнения. В следующем примере определяется действие, которое использует контекст выполнения для создания закладки (механизм, позволяющий действию зарегистрировать точку продолжения в ходе выполнения, которое может быть возобновлено при передаче узлом данных в действие).
public class SimpleReadLine : WorkflowElement
{
protected override void Execute(ActivityExecutionContext context)
{
context.CreateBookmark(this. DisplayName,
new ActivityExecutionCallback(OnReadComplete));
}
void OnReadComplete(ActivityExecutionContext context, object state)
{
string dataRead = (string)state;
Console.WriteLine("You entered: {0}", dataRead);
}
}
Жизненный цикл действия
Экземпляр действия запускается в состоянии выполнения. Если исключения не обнаружены, экземпляр остается в этом состоянии до тех пор, пока дочерние действия и любые другие ожидающие операции (объекты Bookmark, например) не будут завершены, после чего экземпляр переходит в закрытое состояние. Родитель экземпляра действия может приказать дочернему действию прекратить работу; если дочернее действие может быть отменено, оно будет завершено в состоянии «Отменено». Если в ходе выполнения возникает исключение, среда выполнения переводит элемент WorkflowElement в состояние «Ошибка» и распространяет исключение по родительской цепочке действий. Далее приводятся три состояния завершения действия.
Закрыто — действие завершило работу и выполнило выход.
Отменено — действие правильно прекратило работу и выполнило выход. При переходе в это состояние откат операции не будет выполнен явным образом.
Ошибка — действие обнаружило ошибку и выполнило выход без завершения работы.
Действия остаются в состоянии выполнения во время сохранения или выгрузки.