工作流编程循序渐进(3:While活动)

简介:

工作流编程循序渐进(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;

2. 单击外、内层两个循环活动whileActivity1和whileActivity2,分别使用属性窗口设置
循环的规则条件 以外层循环为例,首先需要选择Condition为“声明性 规则条件 ”。然后,在下面的规则命名中输入名称c1。典型情况(推荐)下,我们单击 规则名称c1右边的“...”省略号进入到规则表达式定义对话框,如图所示:

然后,你可以单击“新建”链接创建规则表达式(以后也可以使用“编辑”链接再修改之)。表达式创建窗口如下所示:

[注意]上面的表达式后面不允许有
分号 “;”,否则会出现错误提示。

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();
        }

    }

}

自不必赘述了吧。

四、运行实例

按F5运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。











本文转自朱先忠老师51CTO博客,原文链接:http://blog.51cto.com/zhuxianzhong/203304 ,如需转载请自行联系原作者






相关文章
|
12月前
|
SQL 监控 关系型数据库
SQL语句当前及历史信息查询-performance schema的使用
本文介绍了如何使用MySQL的Performance Schema来获取SQL语句的当前和历史执行信息。Performance Schema默认在MySQL 8.0中启用,可以通过查询相关表来获取详细的SQL执行信息,包括当前执行的SQL、历史执行记录和统计汇总信息,从而快速定位和解决性能瓶颈。
613 1
|
NoSQL 安全 Linux
Redis 从入门到精通之内存和CPU配置优化
Redis 是一种基于内存的数据存储系统,因此内存的规划是非常重要的。在配置 Redis 内存时,应该避免物理内存使用过量导致大量使用 Swap,同时需要考虑内存碎片的问题。根据多年的经验整理了一些建议
1377 106
成功解决:CentOS7中无法连接网络
这篇文章介绍了如何解决CentOS 7虚拟机无法连接网络的问题。作者猜测问题可能是由于虚拟机软件的网关和CentOS 7系统的网关不一致导致的。文章提供了两种解决方案:修改虚拟网络编辑器的网关或修改CentOS系统的网关和IP地址。作者选择了后者,并演示了如何在CentOS终端中以root用户身份修改IP和网关。
成功解决:CentOS7中无法连接网络
|
计算机视觉
ffmpeg配置opus
ffmpeg配置opus
536 0
解决es集群启动完成后报master_not_discovered_exception
解决es集群启动完成后报master_not_discovered_exception
2012 0
|
JavaScript
VUE enement-ui之table表格隐藏滚动条
VUE enement-ui之table表格隐藏滚动条
2000 0
VUE enement-ui之table表格隐藏滚动条
|
机器学习/深度学习 存储 自然语言处理
【论文解读】A review on the attention mechanism of deep learning
注意力已经成为深度学习中最重要的概念之一。本文旨在对近年来提出的最新注意力模型作概述。我们建立了一个较为通用的模型,此外根据四个标准即注意力的柔软性、输入特征的形式、输入表示和输出表示来对当前注意力模型进行分类。最后讨论了注意力在深度学习可解释上的作用。
1848 0