Архитектура рабочего процесса 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 состоянии. Если во время выполнения выбрасывается исключение, среда выполнения помещает действие в определенное состояние и распространяет исключение вверх по родительской цепочке действий. Ниже приведены три состояния завершения действия:

  • Закрыто: Деятельность завершила свою работу и вышла.

  • Отменено: Действие изящно прекратило свою деятельность и завершило работу. Работа не откатывается явным образом при входе в это состояние.

  • Ошибка: Во время выполнения действия произошла ошибка и завершилось, не выполнив работу.

Действия остаются в состоянии Executing, когда они сохраняются или разгружаются.