Arquitectura de Windows Workflow

Windows Workflow Foundation (WF) genera el nivel de abstracción para desarrollar aplicaciones interactivas de ejecución prolongada. Las unidades de trabajo se encapsulan como actividades. Las actividades se ejecutan en un entorno que proporcione los medios para el control de flujo, el control de excepciones, la propagación de errores, la persistencia de los datos de estado, la carga y descarga de flujos de trabajo en progreso de la memoria, el seguimiento y el flujo de la transacción.

Arquitectura de la actividad

Las actividades se desarrollan como tipos CLR que derivan de Activity, CodeActivity, AsyncCodeActivity, o sus variantes que devuelven un valor, NativeActivity, Activity<TResult>, CodeActivity<TResult>, AsyncCodeActivity<TResult> o NativeActivity<TResult>. Desarrollar actividades que derivan de Activity le permite al usuario ensamblar actividades existentes previamente para crear las unidades de trabajo que se ejecutan en el entorno del flujo de trabajo. CodeActivity, por otro lado, permite crear la lógica de ejecución en código administrado usando principalmente CodeActivityContext para el acceso a los argumentos de actividad. AsyncCodeActivity es similar a CodeActivity salvo que puede usarse para implementar tareas asincrónicas. Desarrollar actividades que derivan de NativeActivity permite a los usuarios tener acceso al runtime a través de NativeActivityContext para funciones como la programación de elementos secundarios, la creación de marcadores, invocar el trabajo asincrónico, el registro de transacciones y mucho más.

La creación de actividades que derivan de Activity es declarativo. Estas actividades se pueden crear en XAML. En el siguiente ejemplo, una actividad llamada Prompt se crea usando otras actividades para el cuerpo de ejecución.

<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>  

Contexto de actividad

ActivityContext es la interfaz del autor de la actividad en el tiempo de ejecución del flujo de trabajo y proporciona acceso a la amplia variedad de características del tiempo de ejecución. En el siguiente ejemplo, se define una actividad que usa el contexto de ejecución para crear un marcador (el mecanismo que permite a una actividad registrar un punto de continuación en su ejecución y que puede reanudarse mediante el paso de datos a la actividad por parte de un host).

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);
    }

Ciclo de vida de la actividad

La instancia de una actividad empieza en el estado Executing. A menos que se encuentren excepciones, permanece en este estado hasta que todas las actividades secundarias se hayan terminado de ejecutar y se hayan completado otros trabajos pendientes (objetos Bookmark, por ejemplo). Una vez llegado este punto, cambia al estado Closed. El elemento primario de una instancia de actividad puede pedir a un elemento secundario que cancele; si el elemento secundario puede cancelarse, se completa en el estado Canceled. Si una excepción se produce durante la ejecución, el tiempo en ejecución coloca la actividad Faulted en el estado de error y propaga la excepción a la cadena primaria de actividades. Los siguientes son tres estados de finalización de una actividad:

  • Cerrado: la actividad ha completado su trabajo y ha salido.

  • Cancelado: la actividad ha abandonado su trabajo sin contratiempos y ha salido. En este estado, el trabajo no se revierte de manera explícita.

  • Con errores: la actividad ha encontrado un error y ha salido sin completar su trabajo.

Las actividades permanecen en el estado Executing cuando se conservan o descargan.