试验目标
这个试验的目的是介绍Windows Workflow Foundation工作流的概念。完成这个试验后,你可以:
- 使用Visual Studio 2008设计器编写顺序工作流
- 配置和使用Visual Studion 2008 调试工作流
- 向工作流中传递参数
- 接受一个事件以激活新的工作流的实例
- 定义条件
- 配置基本的活动,包括if/else、Delay、Listen和Code
- 在工作流中利用自定义的活动接受事件
工作流是一个人工或系统的执行过程。这个过程以活动视图的形式定义。一个活动就是工作流中的一个步骤,也是工作流执行、重用和组成的基本单元。工作流的设计,就是设计活动的布局,并将其编译到.NET程序集中。这个程序集会运行在工作流运行时和公共语言运行时中。
练习一 —— 创建一个Hello World 工作流
这个练习中,你会使用Visual Studio 2008的Windows Workflow Foundation 设计器创建一个非常简单的“Hello World ”工作流。Hello World工作流是一个顺序工作流,包含一个code活动。code活动用来在运行时向输出设备打印一句“Hello World”。你将会探索工作流的定义和工作流的Code-Beside。最后,你会看到如何使用一个简单的宿主执行和调试你的工作流。
任务1 —— 创建一个新的工作流的项目
- 在开始|所有程序|Microsoft Visual Studio 2008中打开Visual Studio 2008。
- 选择文件|新建|项目。
- Visual Studio 2008会显示新建项目对话窗口。
- 在新项目对话窗口中,展开左侧项目类型树中的Visual C#|Workflow。
- 选择名为“Sequential Workflow Console Application”并且输入如下属性值:Name: HelloWorldWorkflow
- 现在你就有了一个新的解决方案和工作流项目
- 这个项目模板中有一个Workflow1.cs。而这个在我们将要定义一个简单工作流之前我们将会移除它。选中Workflow1.cs并点击del键。点击Ok按钮以确认删除。
- 在解决方案管理器中,右键单击HelloWorldWorkflow项目,在弹出的菜单中选择添加|新项。
- 在添加新项窗口中,选择Sequential Workflow (with code separation)。点击添加,以加入一个新的工作流到HelloWorldWorkflow项目中。注意:你可以通过点击右上角工具栏中的图标把添加新项对话窗口的视图改为大图标,你就可以预览到模板的全名。
- 新的顺序工作流项目将会包含两个文件:Workflow1.xoml和Workflow1.xoml.cs。Workflow1.xoml包含XML标签来显示工作流的类型。Workflow1.xoml.cs包含的是工作流的code-beside类 .
任务2 —— 添加活动代码
- 在解决方案资源管理器中双击Workflow1.xoml,以打开Visual Studio 工作流设计器。
- 在工作流设计器中,选择视图|工具箱菜单,以在工具箱中显示可用的活动。
- 你需要在工具箱视图中展开Windows Workflow类,就可以看到Workflow Foundation的可用活动。
- 在工具箱中选择Code活动。
- 拖拽Code活动到顺序工作流的设计界面。
- 注意标记在新的Code活动上的惊叹号。单击惊叹号标记来查看Smart箭头,就可以知道这里提示惊叹号的原因。
- 选择Smart箭头将会触发属性工具窗口的显示,并且ExecuteCode属性被标记为高亮。
- 在ExecuteCode属性中输入codeActivity1_CodeHandler,并点击回车。
- 这样就会触发一个新的方法或者事件被添加到工作流的Code-beside类代码中。Visual Studio将会自动打开Workflow1.xoml.cs代码文件并显示新建的codeActivity1_CodeHandler方法。另外,你还可以通过在设计视图中双击活动或者选择视图|代码菜单两种方法,从设计视图跳转到代码界面。
- Code-beside类是一个继承自SequentialWorkflowActivity基类的部分类。这个code-beside类与工作流同名。此时,你的类中会有如下代码:
1: using System;2: using System.ComponentModel;3: using System.ComponentModel.Design;4: using System.Collections;5: using System.Drawing;6: using System.Linq;7: using System.Workflow.ComponentModel.Compiler;8: using System.Workflow.ComponentModel.Serialization;9: using System.Workflow.ComponentModel;10: using System.Workflow.ComponentModel.Design;11: using System.Workflow.Runtime;12: using System.Workflow.Activities;13: using System.Workflow.Activities.Rules;14:
15: namespace HelloWorldWorkflow16: {
17: public partial class Workflow1 : SequentialWorkflowActivity18: {
19: private void codeActivity1_CodeHandler(object sender, EventArgs e)20: {
21:
22: }
23: }
24: }
- 在codeActivity1_CodeHandler方法中添加如下代码,向标准输出设备输出Hello World!
1: private void codeActivity1_CodeHandler(object sender, EventArgs e)2: {
3: Console.WriteLine("Hello,World!");4: }
- 选择生成|生成解决方案,编译并生成你的项目确保没有编译错误或警告。
任务3 —— 使用调试模式运行工作流
在这个练习中,我们将会使用一个简单的宿主程序Program.cs。这个类是我们选择工作流项目模板是自带的。另外,你还可以通过调用定义在System.Workflow.Runtime命名空间中的工作流APIs生成你自己的工作流宿主应用程序。
- 在解决方案资源管理器中双击workflow1.xoml,打开Visual Studio 工作流设计器。
- 单击codeActivity1活动以选中它,并且在它上面设置断点。
- 右键单击code1活动,选择断点|插入断点,来设置断点的位置。
- 现在你应该看到一个红色的圆点在Code1活动的左侧。
- 按下F5,在Visual Studio调试环境下编译并运行解决方案。
- 基于控制台的测试宿主将会启动一个工作流实例。这个实例运行到code活动时,会中断。黄色的框表示调试器停止在的活动。
- 在菜单中选择调试|单步调试,然后调试器将会跳进code1_CodeHandler方法的开始位置。
- 选择几次调试|单步调试,你会看到在测试宿主程序运行的窗口中打印出了“Hello, World!”。
- 至此,工作流运行结束,程序也完成。