工作流编程循序渐进.docx
- 文档编号:10701652
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:63
- 大小:798.66KB
工作流编程循序渐进.docx
《工作流编程循序渐进.docx》由会员分享,可在线阅读,更多相关《工作流编程循序渐进.docx(63页珍藏版)》请在冰点文库上搜索。
工作流编程循序渐进
窗体顶端
工作流编程循序渐进
工作流编程循序渐进(1:
代码活动与时间延迟活动),
创建控制台顺序工作流示例程序框架,请遵循如下步骤创建一个控制台顺序工作流示例程序:
1.启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为CodeAndDelay的控制台顺序工作流示例程序,见下图。
2.之后,系统自动打开工作流设计器界面,如图所示。
3.从工具箱中依次拖动Code,Delay,Code三个活动到图中右侧的汉字提示处,得到如图所示的情形。
此时,图中的三个活动相关参数都没有经过设置,下面将设置有关参数。
为活动创建事件或属性
4.对于Code活动来说,它相当于普通程序流程图中的一段代码模块。
因此,我们可以进入到此活动的ExecuteCode事件中输入相应代码即可。
为此,只要双击图中的图标”codeActivity1“,系统控制转到文件Workflow1.cs中此活动的ExecuteCode事件代码处:
UID
41437
帖子
1401
精华
积分
3017
J力豆
10
贡献值
0
阅读权限
70
在线时间
322小时
注册时间
2007-12-17
最后登录
2009-10-23
namespace CodeAndDelay
{
public sealed partial class Workflow1 :
SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
//......等待输入你的定制代码
}
}
}
创建如下简单代码:
private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine("\n这里是活动一的执行代码,当前时间为{0}。
",DateTime.Now );
}
5.对于活动codeActivity2,也按上述过程操作,并创建类似于下面的代码:
private void codeActivity2_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine("\n这里是活动二的执行代码,当前时间为{0}。
", DateTime.Now);
}
6.切换到工作流设计器界面,然后单击选择延迟活动图标。
在属性窗口中设置属性TimeoutDuration的值为00:
00:
05(”时:
分:
秒“格式)。
因为延迟活动仅仅实现一段时间延迟功能,所以,这个活动是非常容易理解的。
至此,完成了整个工作流部分的设计工作。
非常直观简单!
最后,别忘记把上面文件保存一下。
UID
41437
帖子
1401
精华
积分
3017
J力豆
10
贡献值
0
阅读权限
70
在线时间
322小时
注册时间
2007-12-17
最后登录
2009-10-23
最后,我们来看一下控制台主程序是如何创建工作流实例,并启动工作流执行的。
切换到控制台主程序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运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。
完全合乎意料的结果,一切尽在不言中!
备注(FROMMSDN)
DelayActivity活动有一个InitializeTimeoutDuration事件,它发生在在超时持续时间开始之前发生。
对于此事件,微软的建议是:
不应使用此事件来设置DelayActivity的TimeoutDuration。
而应在工作流的InitializeComponent方法中设置超时持续时间。
工作流编程循序渐进(2:
IfElseActivity活动)
一、引言本文中,我们来学习另一个简单活动--IfElseActivity。
关于此活动,首先需要说明一下:
借助于IfElseActivity活动,你可以创建工作流中的分支结构,每一个分支对应于一个IfElseBranehActivity分支。
IfElseActivitv活动可以有条件地选择执行多个IfElseBranchActivity分支中的一个。
也就是说,对每个IfElseBranchActivity活动的执行,都必须被一个条件所激发。
..
对于IfElseBranchActivity活动的执行条件,如果该条件的计算结果为True,则会执行该IfElseBranchActivity活动中所包含的其他活动;如果计算结果为False,则会对下一个IfElseBranehActivity条件进行计算,依此类推。
IfElseActivity活动的最后一个IfElseBranchActivity活动分支,会被视为Else分支,该分支不需要任何条件来进行激发。
可通过IfElseBranchActivity活动的Condition属性,来为该活动设置条件,共有“代码条件“和“声明性规则条件”两个选项。
’
你可以使用条件来控制工作流的行为。
工作流引擎会判断条件,并依据判断的结果来决定之后的行为。
在工作流中有两种表达条件的方式:
你可以编写一个处理方法并返回一个布尔值。
你可以在工作流中定义一个规则。
你可以在工作流的运行期间动态更新条件规则,来改变工作流的行为。
你也可以通过创建一个策略类型的活动,来使用条件行为。
条件规则只能是工作流类中定义任何公共成员——变量或者方法。
而条件代码可以是任何公共或私有的成员。
下面,我们来构建一个简单的示例。
二、创建控制台顺序工作流示例程序框架
请遵循如下步骤创建一个控制台顺序工作流示例程序:
1.启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为IfElseActivity的控制台顺序工作流示例程序,见下图。
2.之后,系统自动打开工作流设计器界面,如图所示。
3.从工具箱中拖动IfElse活动到图中右侧的汉字提示处,得到如图所示的情形。
4.显然,IfElse活动默认情况下添加了两个分支,这是最为常用和最简单的情形。
其实,你还可以添加另外的更多的分支,以模拟类似于高级语言中的多分支语句switch情形。
方法是右单击IfElse活动并选择“添加分支”即可。
UID
41437
帖子
1401
精华
积分
3017
J力豆
10
贡献值
0
阅读权限
70
在线时间
322小时
注册时间
2007-12-17
最后登录
2009-10-23
5.经过上面的操作后,你得到如下图所示的工作流:
[提示]:
你可以在单击某个IfElseBranch活动后,通过选择属性窗口中的“左移”及“右移”选项调整此活动在图中的位置。
6.根据前面文章中介绍的几种简单活动,我们不妨再添加几个活动,得到如下图所示形式:
我们的设想很简单:
出现一个提示让用户选择自己的角色,根据角色的不同,执行不同的简单活动。
之后,通过一个Delay活动延迟3秒钟,按任意键然后结束。
下面,我们来讨论活动有关属性设置及编码问题。
UID
41437
帖子
1401
精华
积分
3017
J力豆
10
贡献值
0
阅读权限
70
在线时间
322小时
注册时间
2007-12-17
最后登录
2009-10-23
∙ 三、活动有关属性设置及编码
∙ 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。
此时,系统已经为我们自动生成了如下代码:
UID
41437
帖子
1401
精华
积分
3017
J力豆
10
贡献值
0
阅读权限
70
在线时间
322小时
注册时间
2007-12-17
最后登录
2009-10-23
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活动等待。
工作流编程循序渐进(3:
While活动)
一、引言本文中,我们来学习另一个简单活动--While活动。
While活动将会持续循环的执行,直至指定判断为假。
下面,我们来构建一个简单的示例。
本示例的目的是,想主要使用While活动实现显示一个九九乘法表。
二、创建控制台顺序工作流示例程序框架
请遵循如下步骤创建一个控制台顺序工作流示例程序:
1.启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为WhileActivity的控制台顺序工作流示例程序。
2.之后,系统自动打开工作流设计器界面。
3.从工具箱中拖动While活动到图中右侧的汉字提示处,得到如图所示的情形。
4.因为是在控制台中显示一个九九乘法表,所以,一定要使用一个二重循环来实现这一目的。
也就是说,我们要使用一个嵌套的While活动。
另一方面,我们知道:
外层循环与内层循环变量是存在联系的,即在每一次内循环执行完成后,要重新进行某种初始化操作。
因此,直接在一个While活动中嵌入一个While活动是无法实现既定功能的。
但是,还是有解决办法的,我们可以在While活动中嵌入一个复合活动,即一个允许其中继续包含(可能有多个)子活动的活动,例如并行执行活动(Parallel),串行执行活动(Sequence),等等。
5. 为此,我们最终得到如下的工作流图:
UID
41437
帖子
1401
精华
积分
3017
J力豆
10
贡献值
0
阅读权限
70
在线时间
322小时
注册时间
2007-12-17
最后登录
2009-10-23
对于打印一个乘法九九表来说,通常我们可以使用如下一个函数实现:
staticvoidMultiplyTable()
{
inti=1;
intj=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)的私有字段的形式存在,如下:
//创建两个控制内外层循环的变量
privateinti=0;
privateintj=1;
UID
41437
帖子
1401
精华
积分
3017
J力豆
10
贡献值
0
阅读权限
70
在线时间
322小时
注册时间
2007-12-17
最后登录
2009-10-23
2.单击外、内层两个循环活动whileActivity1和whileActivity2,分别使用属性窗口设置循环的规则条件。
以外层循环为例,首先需要选择Condition为“声明性规则条件”。
然后,在下面的规则命名中输入名称c1。
典型情况(推荐)下,我们单击规则名称c1右边的“...”省略号进入到规则表达式定义对话框,如图所示:
然后,你可以单击“新建”链接创建规则表达式(以后也可以使用“编辑”链接再修改之)。
表达式创建窗口如下所示:
[注意]上面的表达式后面不允许有分号“;”,否则会出现错误提示。
3.同样方式创建内循环活动whileActivity2的规则条件为:
this.j<=this.i
4.根据前面的算法分析,我们要分别创建内外循环活动的
privatevoidcodeActivity1_ExecuteCode(objectsender,EventArgse)
{
j=1;
i++;
}
privatevoidcodeActivity2_ExecuteCode(objectsender,EventArgse)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工作流 编程 循序渐进