Windows Workflow Foundation (WF)提高了用于开发交互式长时间运行应用程序的抽象级别。 工作单元封装为活动。 活动运行环境提供用于流控制、异常处理、错误传播、状态数据保存、从内存加载和卸载正在进行的工作流、跟踪以及事务流的功能。
活动体系结构
活动被开发为派生自 Activity、CodeActivity、AsyncCodeActivity 或 NativeActivity 的 CLR 类型,或者它们的变体 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 状态。