Windows 工作流体系结构

Windows Workflow Foundation (WF) 提升了开发长时间运行的交互式应用程序的抽象级别。 工作单元封装为活动。 活动运行环境提供用于流控制、异常处理、错误传播、状态数据保存、从内存加载和卸载正在进行的工作流、跟踪以及事务流的功能。

活动体系结构

活动作为 CLR 类型开发,这些类型或者派生自 ActivityCodeActivityAsyncCodeActivityNativeActivity,或者派生自返回某个值的对应 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 状态。