您的位置:首页 > 其它

【翻译】WF从入门到精通(第七章):基本活动的操作

2008-05-10 21:49 253 查看
上一篇:【翻译】WF从入门到精通(第六章):加载和卸载实例

学习完本章,你将掌握:
1.知道怎样使用Sequence活动
2.知道怎样使用Code活动
3.知道在工作流中怎样抛出异常并对其进行处理
4.知道如何在代码中暂停和终止你的工作流实例

在本章,我们将正式引入前面已经看到过的一组活动:Sequence活动和Code活动。但我相信,适当的错误处理对于精心设计和运行良好的软件是至关重要的,所以我们将会研究如何使用工作流中的活动抛出异常、捕获异常、甚至暂停和终止你的工作流。我们就从Sequence活动开始吧。

使用顺序活动对象

实际上,说我们已见过Sequence活动并不完全正确。我们创建工作流应用程序时实际上使用的是SequentialWorkflow活动,但大体的意思是一样的:这个活动包含其它依次要执行的活动。这一点可和使用parallel活动的并行执行相对比,在第11章(“Parallel活动”)中我们将看到parallel活动。
当你以特定的顺序执行任务时,你必须依次完成这些任务,这点通常是必须的。
Sequence活动是一个组合活动,我们在第四章(“活动和工作流类型介绍”)中已经简要讨论过。它包含其它活动,这些活动一定要按次序执行。你可在父Sequence活动内放入包含parallel活动在内的其它组合活动。但子活动要依次地,一个接一个地执行,即使这些子活动本身包含的并行执行流也如此。
我们就来使用Sequence活动创建一个简单的工作流。我们将再次使用Code活动,关于它的更详细的细节将在下一节“使用Code活动”进行讨论。为对特定的工作流活动的行为进行了解,我们将回到基于控制台的应用程序中。对于基于控制台的应用程序,通常你需要书写的代码更少,因为你不用对用户界面进行处理。(但随着本书的进展,我们也会创建其它的图形化的测试案例。)

创建一个使用了Sequence活动的工作流
1.下载本章的源代码,本例的最终版本在“Sequencer Completed”目录下,可使用Visual Studio 2008打开并直接查看它的运行结果。“Sequencer”目录下则为练习版本,我们将从该版本开始本例的学习,首先使用Visual Studio 2008打开该解决方案。
2.在我们的解决方案中添加一个顺序工作流库的项目,项目名称为“SequencerFlow”。
3.从工具箱中拖拽一个Sequence活动到Visual Studio的工作流视图设计器上。
WorkflowInstance instance =
workflowRuntime.CreateWorkflow(typeof(SequencerFlow.Workflow1));
instance.Start();
10.当然,我们需要在主应用程序项目中引用该SequencerFlow工作流库。
11.编译该应用程序,纠正任何出现的错误。按下F5或Ctrl+F5运行该应用程序。设置一个断点或从命令提示符下运行该程序,这样你就能看到输出结果,结果如下:
private void DoTaskOne(object sender, EventArgs e)
Console.WriteLine("Pre-throwing the exceptionWorkflowException = new Exception(
"This exception thrown for test and evaluation purposesConsole.WriteLine("Post-throwing the exception// Print banner.
Console.WriteLine("Waiting for workflow completion.");
13.在上面的代码下,添加下面的代码:

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(ErrorFlow.Workflow1));

instance.Start();
14.现在,为主应用程序添加对ErrorFlow工作流库的项目引用。
15.编译应用程序,纠正任何编译错误。按下F5或Ctrl+F5运行该应用程序。你将看到下面的结果:
Console.WriteLine("Exception handled within the workflow! The exception was: '{0}'",
WorkflowException != null ? WorkflowException.Message :
"Exception property not set, generic exception thrown");
8.现在编译并执行代码,你将看到下面的执行结果:
workflowRuntime.WorkflowSuspended += new EventHandler<WorkflowSuspendedEventArgs>(workflowSuspended);
5.因为我们使用了名称为WorkflowSuspended的事件处理程序,因此我们需要实现该事件处理程序,代码如下:

static void workflowSuspended(object sender, WorkflowSuspendedEventArgs e)
Console.WriteLine("Workflow instance suspended, error: '{0}'.", e.Error);
waitHandle.Set();
}
6.编译该应用程序,然后按F5或Ctrl+F5执行该程序。该程序的输出结果如下:



运行该应用程序时,你会在控制台中看到主应用程序中的WorkflowSuspended事件处理程序产生的输出结果。但你能做更多的工作,而不是仅仅向控制台输出一串文本。你能为你的业务处理工作流产生任何其它动作。尽管在这里你可能恢复该工作流的处理过程,但通常并不建议这样做。一是全部正处理的活动将会被跳过,保留你的工作流实例以进行处理过程的恢复是后面阶段要做的事,这可能不是好事情(跳过了那些步骤,你又怎么说明它的原因呢?)。但是至少,你能从处理进程中干净地移除该工作流实例,并可使用任何必要的清理代码。
似乎异常和暂停工作流实例都有不足,因此,假如你需要的话,你可这样做,那就是终止你的工作流实例。让我们来看看怎么做。

使用Terminate活动

有些时候事情会变得很糟糕,例如你没有资源,需要结束某个工作流实例;也许从外部进程中返回的一些数据的格式或者计算结果是错误的;或者数据库服务器出现问题,没有它你就不能前进等等。
WF为我们提供了一个现成的方式来终止我们的工作流,那就是使用Terminate活动。Terminate活动的使用方法和Suspend活动完全相同,事实上它们的属性也是相同的。不同之处在于,当Terminate执行时,所有期望你的工作流实例要继续执行的事情都将丢失。
当Terminate执行时,工作流运行时触发WorkflowTerminated事件,这正像有一个未处理的异常一样。当处理WorkflowTerminated事件时获取两个不同方面的信息是困难的,所有你能做的实际上就是检查WorkflowTerminatedEventArgs参数,看看它的Exception属性。假如该工作流实例是使用Terminate活动终止的,该异常类型将会是System.Workflow.ComponentModel.WorkflowTerminatedException而不会是其它(甚至是更加常见)的异常类型。
我们就来看看在我们的工作流代码中怎样使用Terminate活动。

修改我们的工作流,以便使用Terminate活动
1.下载本章源代码,用Visual Studio打开ErrorTerminator文件夹中的解决方案(ErrorTerminator Completed文件夹中为本例的最终源代码)。选中ErrorFlow项目中的Workflow1.cs文件,打开它的工作流视图设计器界面。
2.在错误处理程序的设计界面上删除已存在的Suspend活动,然后从工具箱中拖拽一个Terminate活动到错误处理程序的设计界面上,把该活动放在Code活动的下面。



3.在放好该Terminate活动后,设置它的Error属性为“This is an example termination error...”字符串。
备注:再重复一遍,你可像我们现在做的一样,设置该属性为一个文本字符串,但你也能把该属性绑定到某个活动的字段、属性或者依赖属性上。



4.编译该应用程序,修正所有的编译错误,然后按下F5或者Ctrl+F5运行该应用程序,你将看到下面的运行结果:



Terminate活动和Suspend活动一样,都是相当简单的活动,但它很强大。你通常不会需要它,但当你的工作流出现问题不能继续运行时,Terminate活动就是工具箱中最好的工具。

本章源代码:源码下载(里面包含本章所有练习项目及完整代码)

下一篇:【翻译】WF从入门到精通(第八章):调用外部方法及工作流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐