Архитектура рабочих процессов Windows
Windows Workflow Foundation (WF) повышает уровень абстракции для разработки интерактивных длительных приложений. Блоки обработки инкапсулируются в виде действий. Действия работают в среде, которая обеспечивает средства для управления потоком, обработки исключений, распространения ошибок, сохранения данных состояния, загрузки и выгрузки текущих рабочих процессов из памяти, отслеживания и управления потоком транзакций.
Архитектура действий
Действия разрабатываются в виде типов среды CLR, которые являются производными либо от Activity, CodeActivity, AsyncCodeActivity или NativeActivity, либо от их вариантов, возвращающих значение, Activity<TResult>, CodeActivity<TResult>, AsyncCodeActivity<TResult> или NativeActivity<TResult>. Разработка действий, которые являются производными от действия Activity, позволяет пользователю собирать существующие действия для быстрого создания блоков обработки, работающих в среде рабочих процессов. С другой стороны, действие CodeActivity позволяет создавать логику выполнения в управляемом коде с использованием CodeActivityContext в основном для доступа к аргументам действий. AsyncCodeActivity аналогично CodeActivity, за исключением того, что его можно использовать для реализации асинхронных задач. Разработка действий, которые являются производными от действия NativeActivity, позволяет пользователям получать доступ к среде выполнения посредством NativeActivityContext для таких функций, как планирование дочерних объектов, создание закладок, вызов асинхронной работы, регистрации транзакций и других операций.
Создание действий, которые происходят от действия Activity, является декларативным, при этом эти действия не могут быть созданы на языке XAML. В следующем примере действие Prompt
создается при помощи других действий для тела выполнения.
<Activity x:Class='Prompt'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:z='http://schemas.microsoft.com/netfx/2008/xaml/schema'
xmlns:my='clr-namespace:XAMLActivityDefinition;assembly=XAMLActivityDefinition'
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns="http://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 BookmarkName='r1' Result='[Response]' />
</Sequence>
</Activity>
Контекст действия
ActivityContext представляет собой интерфейс автора действий со средой выполнения рабочих процессов и обеспечивает доступ ко многим функциям среды выполнения. В следующем примере определяется действие, которое использует контекст выполнения для создания закладки (механизм, позволяющий действию зарегистрировать точку продолжения в ходе выполнения, которое может быть возобновлено при передаче узлом данных в действие).
public sealed class ReadLine : NativeActivity<string>
{
[RequiredArgument]
public InArgument<string> BookmarkName { get; set; }
protected override void Execute(NativeActivityContext context)
{
// Create a Bookmark and wait for it to be resumed.
context.CreateBookmark(BookmarkName.Get(context),
new BookmarkCallback(OnResumeBookmark));
}
// NativeActivity derived activities that do asynchronous operations by calling
// one of the CreateBookmark overloads defined on System.Activities.NativeActivityContext
// must override the CanInduceIdle property and return true.
protected override bool CanInduceIdle
{
get { return true; }
}
public void OnResumeBookmark(NativeActivityContext context, Bookmark bookmark, object obj)
{
// When the Bookmark is resumed, assign its value to
// the Result argument.
Result.Set(context, (string)obj);
}
Жизненный цикл действия
Экземпляр действия запускается в состоянии Executing. Если исключения не обнаружены, экземпляр остается в этом состоянии до тех пор, пока дочерние действия и любые другие ожидающие операции (объекты Bookmark, например) не завершены, после чего экземпляр переходит в состояние Closed. Родитель экземпляра действия может запросить прекращение работы дочернего действия; если дочернее действие может быть отменено, оно будет завершено в состоянии Canceled. Если в ходе выполнения возникает исключение, среда выполнения переводит действие в состояние Faulted и распространяет исключение по родительской цепочке действий. Ниже приведены три состояния завершения действия:
Закрыто: действие завершило работу и завершило работу.
Отменено: действие изящно бросило свою работу и завершилось. При переходе в это состояние откат операции не будет выполнен явным образом.
Сбой: действие столкнулось с ошибкой и завершилось без завершения работы.
Во время сохранения или выгрузки действия остаются в состоянии Executing.