使用ConditionedActivityGroup.docx
- 文档编号:11355516
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:17
- 大小:316.17KB
使用ConditionedActivityGroup.docx
《使用ConditionedActivityGroup.docx》由会员分享,可在线阅读,更多相关《使用ConditionedActivityGroup.docx(17页珍藏版)》请在冰豆网上搜索。
使用ConditionedActivityGroup
使用ConditionedActivityGroup(CAG)活动
简要地说,CondtionedActivityGroup活动(通常都称作CAG)是一个组合活动,它为你提供了一个角色,使你能对要执行的并行子活动进行调度。
总的来看,它会运行到你指定的一个条件为true时为止,假如你没有指定这个条件,它则会运行到所有的子活动都报告它们没有更多要去执行的任务时为止。
我提到的这个条件就是CAG的untilcondition。
子活动并行执行,并且只有条件满足的子活动才被执行。
这个条件也就是所谓的whencondition。
假如没有任何子活动满足when条件,也就没有子活动去执行,并且CAG活动会结束,除非你通过设置它的until条件强制它继续进行。
假如一个或多个子活动满足了when条件,那这些子活动将并行执行。
其它没有满足when条件的子活动将维持一个空闲状态。
通过设定要执行的子活动的when条件,你能决定哪些子活动将去执行。
CAG开始执行时要判断它的until条件。
假如判断结果指明要继续执行的话,则也要对每一个子活动的when条件进行判断。
判断结果如确定要去执行,则会导致相关的子活动如期运行。
假如超过一个活动要如期执行,则执行的顺序将取决于它们被放入父CAG活动的顺序。
在每一个子活动执行结束后,CAG将对until条件进行重新判定,同样的还有子活动的when条件。
这是因为对于一个正执行的活动来说,一旦它结束,就可能影响到其它子活动的执行顺序,甚至是整个CAG活动。
CAG在工作流视图设计器中的使用方式也和其它活动大不一样。
它的设计器用户界面和其它活动的插入错误处理程序的界面相似(如图11-1所示)。
假如你拖拽各个子活动到CAG的设计器界面上,并把它们放到两个箭头图标的中间,则在两个箭头中间的矩形略低的地方将显示出如图11-1所示的文字:
编辑。
当你拖拽子活动并放到这个矩形中后,在下方的窗口中将呈现出这些活动的图形。
在图11-1中,你看到了一个名称为setLevel1的活动,它来自于你即将创建的一个示例应用程序。
图11-1ConditionedActivityGroup活动的设计器用户界面
子活动拖进CAG中后有两个显示模式:
预览模式和编辑模式。
图11-1显示的是编辑模式。
在编辑模式中,你能为子活动设置属性,例如设置它的when条件。
当处于预览模式时,你只能浏览子活动的设计器图片,这时在VisualStudio中显示出的属性都是CAG自己的。
点击图11-1中的“编辑”文字左边的小正方形按钮,或者双击主CAG窗口中的子活动,你可在编辑和预览模式之间进行切换。
放到CAG中的子活动都只能是单一的活动。
假如在你的工作流处理过程中其中一个子活动需要执行超过一个以上的功能,就像处理一个事件的过程中,在事件响应时去执行一个Code活动一样,你应使用一个Sequence活动来作为容器,把它放入CAG中作为CAG活动直接的子活动。
像CAG之类的活动的使用场合在什么地方呢?
我认为它是那些很少使用的活动中的一个,但当它适合你的处理模型时,它就会使事情变得非常的简单。
例如,想象这样一个工作流程,需要对某些化学制品或材料的量进行监控。
假如你往储备箱中填入了过量的这些东西,则工作流会自动的把这些过多的制品或物料释放到一个溢出箱中。
当储备箱为空或者低于一个特定的下限值时,这个工作流会检测到这个情况并发送一条警告信息。
对于其它情况,工作流继续对储备箱中的量进行监控,但它不会产生任何动作。
把上面这些转换成CAG后,CAG活动会一直运行到你决定不再需要进行监控时为止。
假如储备箱变得太空,一个子活动会发出一个警告,假如制品或物料的量超过了特定的上限值,则另一个子活动会打开溢出箱。
你可使用一个包含了IfElse活动的while活动来实现同样的功能,但在这个例子中CAG是最合适的。
(也可以说使用CAG活动是更加简洁的解决办法。
)
为了对CAG进行说明示范,我已创建好了我提到的这个应用程序。
TankMonitor使用一个工作流来监控储备箱中流体的量,它使用了一个简单的动画控件来模拟这个储备箱。
图11-2展示了这个空储备箱。
图11-2储备箱为空时的TankMonitor用户界面
图11-3展示的是储备箱为半满时的情形。
而图11-4展示出了储备箱中流体过量时的情形。
和你看到的一样,储备箱下面的label控件会为你提供任何状态提示信息。
这个label控件的提示信息完全由工作流的反馈结果控制,而不是被储备箱的滑动条控件直接进行控制。
图11-3储备箱为半满时的TankMonitor用户界面
图11-4储备箱中流体过量时的TankMonitor用户界面
在你的工作流中使用ConditionedActivityGroup活动
1.在下载的本章源代码文件夹目录中打开名称为TankMonitor的练习项目解决方案。
2.在VisualStudio打开了该解决方案后,在工作流视图设计器中打开Workflow1.cs文件。
3.拖拽一个ConditionedActivityGroup活动到工作流视图设计器界面上。
4.下图是conditionedActivityGroup1在VisualStudio的属性窗口中呈现的界面。
选择UntilCondition属性,这会显示出一个向下的箭头。
点击这个向下的箭头,这会显示出列表选择项,此处选择代码条件。
5.通过点击加号(+)展开UntilCondition属性,在Condition属性中输入CheckContinue。
在VisualStudio添加了对应的事件处理程序后,重新回到工作流视图设计器上来。
6.生成该解决方案(按下F6),这将使本项目中的这个自定义活动呈现在工具箱中。
现在,需向CAG中添加第一个子活动。
从VisualStudio工具箱中,拖拽一个自定义SetLevel活动到工作流视图设计器界面上,把它放到CAG活动的矩形区域中,矩形区域的具体位置在“<”按钮的右边。
如下图所示:
备注:
在CAG的主窗口内显示的锁状图标表示子活动处于预览模式。
(CAG主窗口上方的文字也指明了当前所处的模式。
)进入编辑模式后你能对setLevel1的属性进行编辑,通过点击“<”按钮右方矩形窗口中的setLevel1活动的图标,你也能进入编辑模式并对它的属性进行编辑。
7.我们现在就先进入CAG的编辑模式,点击“预览”文字旁边的微型正方形按钮。
这是一个开关型的按钮,如再点击一次这个按钮,将使CAG再次进入预览模式。
8.进入CAG的编辑模式后,你就可通过在CAG的主窗口中选中它的子活动,然后就可对它的属性进行设置。
我们现在点击setLevel1活动以便激活它的属性。
9.选中setLevel1的WhenCondition属性,它将显示一个向下的箭头,然后从它的列表选择项中选择代码条件。
10.展开这个WhenCondition属性,在Condition属性的文本框中输入AlwaysExecute。
VisualStudio也会自动为你添加一个对应的方法并会切换到代码视图下。
我们需回到工作流视图设计器界面下,因为你还需对setLevel1活动的多个属性进行设置。
11.在setLevel1的Invoked属性中输入OnSetLevel并按下回车键。
在VisualStudio添加了对应的OnSetLevel事件处理程序后,重新回到工作流视图设计器界面下。
12.你需要为setLevel1设置的最后一个属性是Level属性。
选择它的Level属性,这将显示一个浏览(...)按钮,然后点击这个浏览按钮。
这将打开一个“将‘Level’绑定到活动的属性”对话框。
然后点击绑定到新成员选项卡,点击创建属性,在新成员名称中输入TankLevel,最后点击确定。
13.你现在需要向CAG中放入另外一个子活动。
从工具箱中拖拽一个自定义Stop活动到“<”按钮右边的矩形窗口中,并把它放到setLevel1活动的右边。
14.选择stop1的WhenCondition属性,这将显示一个向下的箭头,从它的列表选择项中选择代码条件。
15.点击WhenCondition旁边的“+”,这将显示出Condition属性。
在这个例子中,你可和setLevel1活动共享一个Condition属性值,因此,选中这个Condition属性,这将显示一个下拉列表框,然后从它显示出的列表项中选择AlwaysExecute。
16.接下来选中stop1的Invoked属性,在它的文本框中输入OnStop。
同样,这也会添加一个OnStop方法。
在添加了这个方法后重新回到工作流视图设计器界面上来。
17.现在准备向CAG中添加第三个活动。
这次,拖拽一个自定义UnderfillAlert活动到设计器界面上,把它放到CAG中stop1活动的右边。
18.点击underfillAlert1活动的WhenCondition属性,从显示出的下拉列表框中选择代码条件。
19.点击“+”展开该WhenConditon属性,在Condition中输入CheckEmpty。
同样,在添加了对应的CheckEmpty方法后回到工作流视图设计器界面上来。
20.接下来,你需要把underfillAlert1的level属性绑定到你在第12步中创建的TankLevel属性。
为此,点击level属性激活它的浏览(...)按钮。
然后点击该浏览按钮,这就打开一个“将‘level’绑定到活动的属性”对话框。
但这次,你将绑定到一个现有的属性,因此只需从现有的属性中选中TankLevel即可,然后点击确定。
21.underfillAlert1活动就完全配置好了,我们现在要把最后一个活动添加到本示例应用程序的CAG中。
拖拽一个自定义OverfillRelease活动到设计器界面上,把它放到CAG中其它现有活动的最右边。
22.同样,你需要设置它的WhenCondition属性,因此点击overfillRelease1的WhenCondition属性并从它的下拉列表中选择代码条件。
23.展开WhenCondition旁边的“+”,这就显示出它的Condition属性。
在该属性中输入CheckOverfill。
在添加了对应的CheckOverfill方法后重新回到工作流视图设计器界面上来。
24.和第20步中你为underfillAlert所做的工作一样,现在把overfillRelease1的level属性绑定到TankLevel属性上。
点击level属性,这就显示出一个浏览(...)按钮。
点击该浏览按钮,这将打开一个“将‘level’绑定到活动的属性”对话框。
从现有属性列表中选择TankLevel,然后点击确定。
25.本工作流在视图设计器界面上的设计工作就完成了,现在需要切换到Workflow1.cs的代码视图下添加一些代码。
26.打开Workflow1.cs源文件,在源文件中找到Workflow1构造器。
在构造器下面添加如下的代码,主要作用是创建在启动工作流时需要用到的储备箱中容纳流体的下限值和上限值的属性。
privatebool_stop=false;
privateInt32_min=-1;
privateInt32_max=-1;
privatebool_notificationIssued=false;
publicInt32TankMinimum
{
get{return_min;}
set{_min=value;}
}
publicInt32TankMaximum
{
get{return_max;}
set{_max=value;}
}
27.接下来你将看到的是CheckContinue方法,这个方法是你在设置CAG的UntilCondition属性时自动添加的。
这个方法实际上是一个事件处理程序,ConditionalEventArgs包含了一个Result属性,你可对其设置以决定是让CAG继续进行处理还是让它停止,如设置Result为true将使其停止,而设置为false将使其继续进行处理。
向CheckContinue中添加下面一行代码(_stop是一个标志,它在OnStop事件处理程序中被设置):
e.Result=_stop;
28.两个CAG活动,setLevel1和stop1,都应当始终运行。
因此在AlwaysExecute中添加下面一行代码:
e.Result=true;
29.找到OnSetLevel方法,在SetLevel事件被响应时将调用该方法。
实际上储备箱中的量是由WF自动为你设置的,因为你把setLevel1的Level属性绑定到了TrankLevel这个依赖属性上。
下面添加的代码的作用是对任何警告通知进行重置,以便在储备箱中量的新值不再合理范围内时能让overfill活动或underfill活动发出它们的通知。
_notificationIssued=false;
30.Stop事件的作用是当它触发时对CAG的UntilCondition进行设置以使它停止处理。
在Workflow1.cs文件中找到OnStop方法,并为它添加下面两行代码:
//Setthestopflag
_stop=true;
31.接下来定位到underfillAlert1的WhenConditon属性对应的CheckEmpty方法。
尽管你想让CAG每次都对它的子活动的WhenCondition进行判断,但你并不想让通知(低于下限值或超过上限值时)不停地发送到用户界面上,因为这将消耗过多的CPU周期。
实际上,你只想让通知在储备箱的容量状态级别发生更改后只发出一次。
下面的代码就为你做这个工作,这些代码添加到CheckEmpty方法中。
//Iftooempty,execute
e.Result=false;
if(TankLevel<=TankMinimum)
{
e.Result=!
_notificationIssued;
_notificationIssued=e.Result;
}//if
32.overfillRelease1也需要对它的WhenCondition进行判断,因此找到CheckOverfill方法并添加和上面相似的代码:
//Iftoofull,execute
e.Result=false;
if(TankLevel>=TankMaximum)
{
e.Result=!
_notificationIssued;
_notificationIssued=e.Result;
}//if
33.保存所有打开的文件,编译该解决方案。
34.执行该应用程序。
向上或向下拉动滑动条可对储备箱进行补充或抽空进行模拟。
当储备箱中的流体超过或低于边界条件时注意观察它下面所显示的文本。
备注:
我在创建这个TankMonitor应用程序的过程中,当添加事件处理程序时会感到它非常像是一个基于状态机的工作流。
假如在你创建顺序工作流的过程中发现,在一个特别的业务流程中使用一点点基于状态机的处理流程会更有用的话,CAG或许就是一个既快速又简便的极好的选择,这不用重新创建并调用一个独立的基于状态机的工作流。
信不信由你,到现在你已经看到过足够多的用来解决许多和工作流任务相关的处理过程,但这些章节讨论的话题还只是加深你对WF的理解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 ConditionedActivityGroup