Windows 工作流体系结构
本主题适用于 Windows Workflow Foundation 4。
Windows Workflow Foundation (WF) 提升了开发长时间运行的交互式应用程序的抽象级别。工作单元封装为活动。活动运行环境提供用于流控制、异常处理、错误传播、状态数据保存、从内存加载和卸载正在进行的工作流、跟踪以及事务流的功能。
活动体系结构
活动作为 CLR 类型开发,这些类型或者派生自 Activity、CodeActivity 或 NativeActivity,或者派生自返回某个值的对应 Activity、CodeActivity 或 NativeActivity 变体。通过开发派生自 Activity 的活动,用户可以组合预先存在的 WorkflowElement 对象,以便快速创建在工作流环境中执行的工作单元。另一方面,CodeActivity 支持通过将 CodeActivityContext 主要用于访问活动参数,在托管代码中创作执行逻辑。通过开发派生自 NativeActivity 的活动,用户可以通过 ActivityExecutionContext 访问运行时,以实现安排子级、创建书签、调用异步工作、注册事务等功能。
创作派生自 Activity 的活动是声明性的,可以在 XAML 中创作这些活动。下面的示例使用其他活动作为执行体来创建一个名为 Prompt
的活动。
<Activity x:Class='Prompt'
xmlns:x='https://schemas.microsoft.com/winfx/2006/xaml'
xmlns:z='https://schemas.microsoft.com/netfx/2008/xaml/schema'
xmlns:my='clr-namespace:XAMLActivityDefinition;assembly=XAMLActivityDefinition'
xmlns:s="clr-namespace:System;assembly=mscorlib"
xmlns="https://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 Bookmark='r1' Result='[Response]' />
</Sequence>
</Activity>
活动执行上下文
ActivityExecutionContext 是活动作者的工作流运行时接口,提供对诸多运行时功能的访问。下面的示例定义一个使用执行上下文创建书签(一种机制,允许活动在其执行中注册一个延续点,该延续点可由将数据传入活动的主机恢复)的活动。
public class SimpleReadLine : WorkflowElement
{
protected override void Execute(ActivityExecutionContext context)
{
context.CreateBookmark(this. DisplayName,
new ActivityExecutionCallback(OnReadComplete));
}
void OnReadComplete(ActivityExecutionContext context, object state)
{
string dataRead = (string)state;
Console.WriteLine("You entered: {0}", dataRead);
}
}
活动生命周期
活动实例启动时处于“正在执行”状态。除非发生异常,否则活动将保持此状态,直到已完成执行所有子活动和所有其他挂起的工作(如 Bookmark 对象),此时,该活动将转换为“已关闭”状态。 活动实例的父级可以请求取消子级;如果可以取消子级,该子级则在完成时处于“已取消”状态。 如果在执行期间引发异常,运行时会使 WorkflowElement 进入“出错”状态,并将此异常向上传播到活动父链。下面列出了活动的三个完成状态:
**已关闭:**活动已完成其工作并退出。
**已取消:**活动已正常放弃其工作并退出。当进入此状态时,不会显式回滚工作。
**出错:**活动已遇到错误,并且在未完成其工作的情况下退出。
当保存或卸载活动时,活动会保持“正在执行”状态。