工作流编程循序渐进(2:IfElseActivity活动)

简介:

工作流编程循序渐进(2:IfElseActivity活动)


作者  朱先忠

一、引言

本文中,我们来学习另一个简单活动--IfElseActivity。关于此活动,首先需要说明一下:

  • 借助于IfElseActivity活动,你可以创建工作流中的分支结构,每一个分支对应于一个IfElseBranehActivity分支。
  • IfElseActivitv活动可以有条件地选择执行多个IfElseBranchActivity分支中的一个。也就是说,对每个IfElseBranchActivity活动的执行,都必须被一个条件所激发。    ..
  • 对于IfElseBranchActivity活动的执行条件,如果该条件的计算结果为True,则会执行该IfElseBranchActivity活动中所包含的其他活动;如果计算结果为False,则会对一个IfElseBranehActivity条件进行计算,依此类推。
  • IfElseActivity活动的最后一个IfElseBranchActivity活动分支,会被视为Else分支,该分支不需要任何条件来进行激发。
  • 可通过IfElseBranchActivity活动的Condition属性,来为该活动设置条件,共有“代码条件“和“声明性规则条件”两个选项。    ’

你可以使用条件来控制工作流的行为。工作流引擎会判断条件,并依据判断的结果来决定之后的行为。在工作流中有两种表达条件的方式:
  1. 你可以编写一个处理方法并返回一个布尔值。
  2. 你可以在工作流中定义一个规则。
你可以在工作流的运行期间动态更新条件规则,来改变工作流的行为。
你也可以通过创建一个策略类型的活动,来使用条件行为。

条件规则只能是工作流类中定义任何公共成员——变量或者方法。而条件代码可以是任何公共或私有的成员。


下面,我们来构建一个简单的示例。

二、创建控制台顺序工作流示例程序框架


请遵循如下步骤创建一个控制台顺序工作流示例程序:
1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为
IfElseActivity 的控制台顺序工作流示例程序,见下图。

2.之后,系统自动打开工作流设计器界面,如图所示。
3. 从工具箱中拖动IfElse 活动到图中右侧的汉字提示处,得到如图所示的情形。

4. 显然, IfElse 活动默认情况下添加了两个分支,这是最为常用和最简单的情形。其实,你还可以添加另外的更多的分支,以模拟类似于高级语言中的多分支语句switch情形。方法是右单击 IfElse 活动并选择“添加分支”即可。



5. 经过上面的操作后,你得到如下图所示的工作流:

[提示]:你可以在单击某个IfElseBranch活动后,通过选择属性窗口中的“左移”及“右移”选项调整此活动在图中的位置。

6.根据前面文章中介绍的几种简单活动,我们不妨再添加几个活动,得到如下图所示形式:

我们的设想很简单:出现一个提示让用户选择自己的角色,根据角色的不同,执行不同的简单活动。之后,通过一个Delay活动延迟3秒钟,按任意键然后结束。

下面,我们来讨论活动有关属性设置及编码问题。

三、活动有关属性设置及编码

1.单击最左边的 IfElseBranch活动,在对应的属性对话框中指定Condition为“代码条件”,输入条件方法名为Condition1,如图所示:
然后,按下回车键,系统即自动跳转到此方法代码编辑处,输入如下内容:


        private void Condition1(object sender, ConditionalEventArgs e)
        {
            if (rolename.ToUpper() == "A")
                e.Result = true;
            else
                e.Result = false;
        }

类似地,设置中间 IfElseBranch活动的触发条件也为代码条件,输入条件方法名为Condition2,相关代码为:


        private void Condition2(object sender, ConditionalEventArgs e)
        {
            if (rolename.ToUpper() == "C")
                e.Result = true;
            else
                e.Result = false;
        }

因为我们的例子中仅有三个条件,所以,前两种情况不满足时,便执行最后一个活动。因此,不必为之指定触发条件方法。

2.现在,依次设置上面图中从左向右三个子条件中Code活动的 ExecuteCode 方法代码如下:

        private void admin_ExecuteCode(object sender, EventArgs e)
        {
            Console.WriteLine("您好,管理员!");
        }

        private void codeActivity3_ExecuteCode(object sender, EventArgs e)
        {
            Console.WriteLine("您好,客户!");
        }

        private void passenger_ExecuteCode(object sender, EventArgs e)
        {
            Console.WriteLine("您好,过客!");
        }


3. 设置codeActivity1活动 ExecuteCode 方法代码如下:

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
            Console.WriteLine("请选择您的角色:(C-普通客户;A-系统管理员;P-过客)");
            rolename = Console.ReadLine();
        }


4. 设置最后面那个 codeActivity2 活动 ExecuteCode 方法代码如下:


        private void codeActivity2_ExecuteCode(object sender, EventArgs e)
        {
            Console.Read();
        }



5. 另外,设置 Delay活动延迟3秒钟非常简单,不赘述。
至此,完成了整个工作流部分的设计工作。 非常直观简单!最后, 别忘记把上面文件保存一下。

最后,我们来看一下控制台主程序是如何创建工作流实例,并启动工作流执行的。切换到
控制台主程序Program.cs。此时,系统已经为我们自动生成了如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;

namespace CodeAndDelay
{
    class Program
    {
        static void Main(string[] args)
        {
            //......经常在此添加一些初始化代码

            // 创建工作流实例,并启动工作流执行。注意:工作流是以 异步的独立的工作线程方式执行的
            using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
            {
                AutoResetEvent waitHandle = new AutoResetEvent(false);
                workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
                workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
                {
                    Console.WriteLine(e.Exception.Message);
                    waitHandle.Set();
                };

                WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(CodeAndDelay.Workflow1));
                instance.Start();

                waitHandle.WaitOne();
            }

            //......在此经常执行一些工作流执行后的善后工作

        }
    }
}


注意:有关上面代码中AutoResetEvent事件等的详细讨论将在后续文章中介绍。

四、运行实例

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

第一个界面:

接下字母a,并按下回车键,得到下图:


无他复杂设计,不再赘述。

五、小结

在本文中我们学习了IfElseActivity 活动的使用过程,在下一篇中将学习另外几个基本活动--While活动,ConditionalActivityGroup活动,Replicator活动等待
















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



相关文章
|
2月前
|
存储 人工智能 自然语言处理
Lakehouse x AI ,打造智能 BI 新体验
本文整理自瓴羊的王璟尧老师与镜舟科技石强老师的联合分享,围绕 Quick BI 在智能 BI 场景中的落地实践,深入探讨了 StarRocks 如何凭借 MPP 架构、实时分析能力与 AI 原生支持,成为智能分析的理想 Lakehouse 引擎底座,助力 BI 从“被动查询”迈向“主动决策”,开启数据“会说话”的新体验。
|
Linux 数据库 数据安全/隐私保护
如何使用 Docker 安装宝塔面板
Docker 是一个高效、灵活、轻量级的容器化平台,可以在单个操作系统上实现多个容器化应用的隔离和运行。而宝塔面板是一款集成了 Web 服务器、数据库和运行环境的 Linux 服务器管理面板,其功能非常强大且易于使用。在本文中,我们将介绍使用 Docker 安装宝塔面板的优势和详细命令,让您轻松搭建自己的 Web 服务。
6804 3
|
XML JSON Dubbo
《微服务零基础入门教程》一步一步,带你走进微服务的世界(上)
最近几个月,我会从“0”到“1”持续更新 微服务 技术栈以及其相关的技术,希望小伙伴们跟着我的脚步,让我们一步一步的拿下微服务 学微服务之前,先让大家看一下首先要学习哪些技术
2039 1
《微服务零基础入门教程》一步一步,带你走进微服务的世界(上)
|
对象存储 容器 云计算
标准流程描述语言 WDL 阿里云最佳实践
WDL 作为全球基因组与健康联盟 (Global Alliance for Genomics and Health)支持的工作流描述语言,已经被越来越多的客户所采用。通过阿里云的 Cromwell 方案,用户可以本地开发测试WDL流程,再使用云计算强大的计算能力,来完成基因组学数据分析工作。
11213 3
|
自然语言处理 算法 PyTorch
从零开始构建大语言模型(MEAP)(3)
从零开始构建大语言模型(MEAP)
256 1
|
机器学习/深度学习 存储 自然语言处理
从零开始构建大语言模型(MEAP)(2)
从零开始构建大语言模型(MEAP)
503 1
|
机器学习/深度学习 数据采集 人工智能
从零开始构建大语言模型(MEAP)(1)
从零开始构建大语言模型(MEAP)
574 1
|
数据安全/隐私保护
宝塔安装gitlab
宝塔安装gitlab
379 0
|
传感器 编解码 芯片
[硬件选型] 工业镜头之参数和选型
[硬件选型] 工业镜头之参数和选型
649 0
|
负载均衡 安全 Dubbo
深入浅出微服务:40个微服务架构实战案例(Dubbo+Springcloud)
微服务在近几年来可以说是十分火爆,我们应该知道微服务的发展历程大致分为6个阶段分别是:单体应用阶段提、垂直应用阶段、分布式系统阶段、服务治理阶段、微服务阶段、最后到服务网格阶段。