Windows 工作流体系结构

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

活动体系结构

活动被开发为派生自 ActivityCodeActivityAsyncCodeActivityNativeActivity 的 CLR 类型,或者它们的变体 Activity<TResult>CodeActivity<TResult>AsyncCodeActivity<TResult>NativeActivity<TResult>,这些变体会返回一个值。 开发派生自 Activity 的活动允许用户组合预先存在的活动,以快速创建在工作流环境中执行的工作单元。 另一方面,CodeActivity 支持通过将 CodeActivityContext 主要用于访问活动参数,在托管代码中创作执行逻辑。 AsyncCodeActivityCodeActivity 类似之处在于,它可以用来实现异步任务。 通过开发派生自 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 状态。