工作流编程循序渐进(3:While活动)
作者 朱先忠
一、引言
本文中,我们来学习另一个简单活动--While活动。While活动将会持续循环的执行,直至指定判断为假。
下面,我们来构建一个简单的示例。本示例的目的是,想主要使用While活动实现显示一个九九乘法表。二、创建控制台顺序工作流示例程序框架
请遵循如下步骤创建一个控制台顺序工作流示例程序:
1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为WhileActivity 的控制台顺序工作流示例程序。
2.之后,系统自动打开工作流设计器界面。
3. 从工具箱中拖动While 活动到图中右侧的汉字提示处,得到如图所示的情形。
4. 因为是在控制台中显示一个九九乘法表,所以,一定要使用一个二重循环来实现这一目的。也就是说,我们要使用一个嵌套的While活动。另一方面,我们知 道:外层循环与内层循环变量是存在联系的,即在每一次内循环执行完成后,要重新进行某种初始化操作。因此,直接在一个While活动中嵌入一个While 活动是无法实现既定功能的。
另外需要注意的是,While活动仅允许包括一个子活动。 |
但是,还是有解决办法的,我们可以在While活动中嵌入一个复合活动,即一个允许其中继续包含(可能有多个)子活动的活动,例如并行执行活动(Parallel),串行执行活动(Sequence),等等。
5. 为此,我们最终得到如下的工作流图:
对于打印一个乘法九九表来说,通常我们可以使用如下一个函数实现:
static void MultiplyTable() { int i = 1; int j = 1; for (i = 1; i <= 9; i++) { for (j = 1; j <= i; j++) { if (i == j) { Console.Write("{0} * {1}={2} ", i, j, i * j); Console.WriteLine(""); } else Console.Write("{0} * {1}={2} ", i, j, i * j); } } } |
于是,我们会得到如下图所示的打印效果:
下面,我们也想通过工作流操作实现上图打印效果。现在来讨论活动有关属性设置及编码问题。
三、活动有关属性设置及编码
1. 在本例中,我们要使用规则条件表达内外层循环的规则条件。为此,先要定义两个循环变量(以工作流Workflow1)的私有字段的形式存在,如下: //创建两个控制内外层循环的变量 private int i = 0; private int j = 1; |
[注意]上面的表达式后面不允许有 分号 “;”,否则会出现错误提示。
3.同样方式创建 内循环活动whileActivity2 的规则条件为:
this.j <= this.i |
4. 根据前面的算法分析,我们要分别创建 内外循环活动的
private void codeActivity1_ExecuteCode(object sender, EventArgs e) { j = 1; i++; } private void codeActivity2_ExecuteCode(object sender, EventArgs e) { if (i == j) { Console.Write("{0} * {1}={2} ", i, j, i * j); Console.WriteLine(""); } else Console.Write("{0} * {1}={2} ", i, j, i * j); j++; } |
5. 下面是完整的工作流类定义代码:
using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Collections; using System.Drawing; using System.Linq; using System.Workflow.ComponentModel.Compiler; using System.Workflow.ComponentModel.Serialization; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.Runtime; using System.Workflow.Activities; using System.Workflow.Activities.Rules; namespace WhileActiviity { public sealed partial class Workflow1 : SequentialWorkflowActivity { //创建两个控制内外层循环的变量 private int i = 0; private int j = 1; public Workflow1() { InitializeComponent(); } private void codeActivity1_ExecuteCode(object sender, EventArgs e) { j = 1; i++; } private void codeActivity2_ExecuteCode(object sender, EventArgs e) { if (i == j) { Console.Write("{0} * {1}={2} ", i, j, i * j); Console.WriteLine(""); } else Console.Write("{0} * {1}={2} ", i, j, i * j); j++; } private void codeActivity3_ExecuteCode(object sender, EventArgs e) { Console.Read(); } } } |
自不必赘述了吧。