WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹦绠鹃柍褜鍓氱换娑欐媴閸愬弶鎼愮痪鍓ф嚀閳规垿鎮╃€圭姴顥濋梺姹囧€楅崑鎾诲Φ閸曨垰绠涢柛顐f礃椤庡秹姊虹粙娆惧剳闁哥姵鍔欐俊鐢稿礋椤栨艾鍞ㄩ梺闈浤涙担鎻掍壕闁圭儤顨嗛埛鎺楁煕閺囥劌浜滄い蹇e弮閺屸€崇暆鐎n剛鏆犻柧浼欑到閵嗘帒顫濋悡搴d画缂佹鍨垮缁樻媴缁涘娈┑顔斤公缁犳捇銆佸鎰佹▌濠电姭鍋撳ù锝囩《閺€浠嬫煟濡鍤嬬€规悶鍎辫灃闁绘ê寮堕崯鐐电磼閸屾氨效鐎规洘绮忛ˇ瀵哥棯閹佸仮鐎殿喖鐖煎畷鐓庘槈濡警鐎崇紓鍌欑劍椤ㄥ棗鐣濋幖浣歌摕闁绘棃顥撻弳瀣煟濡も偓閻楀棗鈻撳Δ鍛拺閻犲洠鈧櫕鐏€闂佸搫鎳愭慨鎾偩閻ゎ垬浜归柟鐑樼箖閺呮繈姊洪棃娑氬婵☆偅鐟╅、娆掔疀閺冨倻鐦堥梺姹囧灲濞佳勭閿曞倹鐓曢柕濞垮劤閸╋絾顨ラ悙鏉戝妤犵偞锕㈤、娆撴嚃閳哄骞㈤梻鍌欐祰椤鐣峰Ο鑲╃煋妞ゆ棁锟ユ禍褰掓煙閻戞ɑ灏ù婊冪秺濮婅櫣绱掑Ο铏逛桓闂佹寧娲嶉弲娑滅亱闂佸憡娲﹂崹閬嶅煕閹达附鐓欓柤娴嬫櫅娴犳粌鈹戦垾鐐藉仮闁诡喗顨呴埥澶愬箳閹惧褰囩紓鍌欑贰閸犳牠顢栭崨鎼晣闁稿繒鍘х欢鐐翠繆椤栨粎甯涙繛鍛喘濮婄粯鎷呴悷閭﹀殝缂備浇顕ч崐鍨嚕缂佹ḿ绡€闁搞儯鍔嶅▍鍥⒑缁嬫寧婀扮紒瀣崌瀹曘垽鎮介崨濠勫幗闁瑰吋鐣崹濠氬煀閺囥垺鐓ユ慨妯垮煐閻撶喖鐓崶銉ュ姢缂佸宕电槐鎺旂磼濡偐鐣虹紓浣虹帛缁诲牆鐣峰鈧俊姝岊槺缂佽鲸绻堝缁樻媴缁涘娈愰梺鎼炲妺閸楀啿鐣烽鐐茬骇闁瑰濮靛▓楣冩⒑缂佹ɑ鈷掗柍宄扮墦瀵偊宕掗悙瀵稿幈闂佹娊鏁崑鎾绘煛閸涱喚鎳呮俊鍙夊姇铻i悶娑掑墲閺傗偓闂備胶绮崝鏇炍熸繝鍥у惞闁绘柨鐨濋弨鑺ャ亜閺冨洦顥夐柛鏂诲€濋幗鍫曟倷閻戞ḿ鍘遍梺鍝勬储閸斿本鏅堕鐐寸厱婵炲棗绻掔粻濠氭煛鐏炵晫效鐎规洦鍋婂畷鐔碱敆閳ь剙鈻嶉敐鍥╃=濞达絾褰冩禍鐐節閵忥絾纭炬い鎴濇川缁粯銈i崘鈺冨幍闁诲孩绋掑玻璺ㄧ不濮椻偓閺屻劌鈽夊Ο澶癸絾銇勯妸锝呭姦闁诡喗鐟╅、鏃堝礋椤撴繄绀勯梻鍌欐祰椤曟牠宕伴弽顐ょ濠电姴鍊婚弳锕傛煙椤栫偛浜版俊鑼额嚙閳规垿鍩勯崘銊хシ濡炪値鍘鹃崗妯侯嚕鐠囨祴妲堥柕蹇曞閳哄懏鐓忓璺虹墕閸旀挳鏌涢弬娆炬Ш缂佽鲸鎸婚幏鍛矙鎼存挸浜鹃柛婵勫劤閻挾鎲搁悧鍫濈瑨闁哄绶氶弻鐔煎礈瑜忕敮娑㈡煛閸涱喗鍊愰柡灞诲姂閹倝宕掑☉姗嗕紦 ---闂傚倸鍊搁崐鎼佸磹閻戣姤鍊块柨鏃堟暜閸嬫挾绮☉妯哄箻婵炲樊浜滈悡娑㈡煕濞戝崬骞樻い鏂挎濮婅櫣鎹勯妸銉︾彚闂佺懓鍤栭幏锟�
开发学院软件开发C语言 工作流编程循序渐进(5:状态机工作流) 阅读

工作流编程循序渐进(5:状态机工作流)

 2010-09-30 21:03:37 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹妞嬪孩顐芥慨姗嗗厳缂傛氨鎲稿鍫罕闂備礁婀遍搹搴ㄥ窗閺嶎偆涓嶆い鏍仦閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹闂傚倸鍊搁崐鎼佸磹妞嬪海鐭嗗〒姘e亾妤犵偛顦甸弫鎾绘偐閹绘帞鈧參姊哄Ч鍥х仼闁诲繑鑹鹃悾鐑藉蓟閵夛妇鍘甸梺瑙勵問閸犳牠銆傛總鍛婄厱閹艰揪绱曟牎闂侀潧娲ょ€氫即鐛幒妤€绠f繝闈涘暙娴滈箖鏌i姀鈶跺湱澹曟繝姘厵闁绘劦鍓氶悘杈ㄤ繆閹绘帞澧涚紒缁樼洴瀹曞崬螖閸愬啠鍓濈换娑樼暆婵犱胶鏁栫紓浣介哺閹瑰洤鐣烽幒鎴僵闁瑰吀鐒﹂悗鎼佹⒒娴g儤鍤€闁搞倖鐗犻獮蹇涙晸閿燂拷濠电姷鏁告慨鐑藉极閸涘﹥鍙忔い鎾卞灩缁狀垶鏌涢幇闈涙灈鐎瑰憡绻冮妵鍕箻鐎靛摜鐣奸梺纭咁潐濞茬喎顫忕紒妯肩懝闁逞屽墮宀h儻顦查悡銈夋煏閸繃鍋繛宸簻鎯熼梺瀹犳〃閼冲爼宕濋敃鈧—鍐Χ閸℃鐟愰梺鐓庡暱閻栧ジ宕烘繝鍥у嵆闁靛骏绱曢崢顏堟⒑閹肩偛鍔楅柡鍛⊕缁傛帟顦寸紒杈ㄥ笚濞煎繘鍩℃担閿嬵潟闂備浇妗ㄩ悞锕傚箲閸ヮ剙鏋侀柟鍓х帛閺呮悂鏌ㄩ悤鍌涘闂傚倸鍊搁崐鎼佸磹妞嬪孩顐芥慨姗嗗厳缂傛氨鎲稿鍫罕闂備礁婀遍搹搴ㄥ窗閺嶎偆涓嶆い鏍仦閻撱儵鏌i弴鐐测偓鍦偓姘炬嫹  闂傚倸鍊搁崐鎼佸磹閻戣姤鍤勯柤鍝ユ暩娴犳氨绱撻崒娆掑厡缂侇噮鍨堕妴鍐川閺夋垹鍘洪悗骞垮劚椤︻垶宕¢幎鑺ョ厪闊洦娲栨牎闂佽瀵掗崜鐔奉潖閾忓湱纾兼俊顖氭惈椤矂姊虹拠鑼婵ǜ鍔戦崺鈧い鎺嶇閸ゎ剟鏌涢幘璺烘瀻妞ゎ偄绻愮叅妞ゅ繐瀚悗顓烆渻閵堝棙绀€闁瑰啿閰e畷婊勫鐎涙ǚ鎷洪梻渚囧亞閸嬫盯鎳熼娑欐珷妞ゆ柨澧界壕鐓庮熆鐠虹尨鍔熺紒澶庢閳ь剚顔栭崰鏍€﹂柨瀣╃箚婵繂鐭堝Σ鐑芥⒑缁嬫鍎愰柟鐟版搐铻為柛鎰╁妷濡插牊绻涢崱妤冪婵炲牊锕㈠缁樻媴妞嬪簼瑕嗙紓鍌氱М閸嬫挻绻涚€涙ḿ鐭ら柛鎾跺枛瀹曟椽鍩€椤掍降浜滈柟鐑樺灥閳ь剙缍婂鎶筋敆閸曨剛鍘遍柣搴秵娴滅兘鐓鍌楀亾鐟欏嫭纾婚柛妤€鍟块锝夊磹閻曚焦鞋闂備礁鎼Λ瀵哥不閹捐钃熼柕濞炬櫆閸嬪棝鏌涚仦鍓р槈妞ゅ骏鎷�
核心提示:一、状态机工作流简介 状态机工作流由一组状态组成,一个状态被指示为初始状态,工作流编程循序渐进(5:状态机工作流),每个状态都可以接收一组特定事件,视事件而定,所以,需要把整个状态机工作流的InitialStateName属性更改为“准备”,可以转换到另一个状态,状态机工作流可以有最终状态

一、状态机工作流简介

状态机工作流由一组状态组成。一个状态被指示为初始状态。每个状态都可以接收一组特定事件。视事件而定,可以转换到另一个状态。状态机工作流可以有最终状态。当转换到最终状态时,工作流将完成。

[一]状态机设计器视图

状态机设计器是一种自由形式的设计器,这意味着可以在设计图面上自由移动活动。

状态机设计器有两个视图:

(1)“状态”视图

(2)“事件驱动”视图

状态视图显示状态活动和可包含在状态活动内的事件驱动的活动。在此视图中,从一个状态到另一个状态的转换是由直线表示的,这些直线从一个状态中的事件驱动活动延伸到另一个状态。

也可以通过自己绘制直线来创建一个状态活动到另一个状态活动的转换。若要绘制转换,请你选择事件驱动的活动,然后选择活动上的某个手柄并拖动该手柄。此操作将绘制直线。此直线随后将连接到目标状态,指示状态之间的转换。如下图所示:

工作流编程循序渐进(5:状态机工作流)

拖动上图状态活动内部的事件驱动活动的手柄,拖动到下面的状态活动上即可,得到如下图所示的结果:

工作流编程循序渐进(5:状态机工作流)

若要访问事件驱动的视图,请双击事件驱动的活动。出现的设计器与顺序工作流设计器很像。在设计器的顶部,导航栏显示直到所显示事件驱动活动为止的活动层次结构。可以通过单击显示的层次结构中的任意元素导航回状态视图。如果已在状态视图中绘制了从一个状态到另一个状态的转换,并且正在显示该活动的事件驱动视图,则会为您将一个已设置状态活动添加到事件驱动的活动。如果更改已设置状态活动的属性,它将反映到状态视图中。

[二]状态机工作流活动

下表描述了状态机工作流设计器中使用的关键活动。

工具箱名称 活动 说明

State

StateActivity

表示状态机中的一个状态;可能包含其他 StateActivity 活动。有关更多信息,请参见 使用 StateActivity 活动(可能为英文网页)。

SetState

SetStateActivity

指定到新状态的转换。有关更多信息,请参见 使用 SetStateActivity 活动(可能为英文网页)。

StateInitialization

StateInitializationActivity

在进入某个状态时执行;可能包含其他活动。有关更多信息,请参见 使用 StateInitialization 活动(可能为英文网页)。

StateFinalization

StateFinalizationActivity

在离开 StateActivity 活动时执行包含的活动。有关更多信息,请参见 使用 StateFinalizationActivity 活动(可能为英文网页)。

EventDriven

EventDrivenActivity

用于依赖于外部事件开始执行的状态。EventDrivenActivity 活动必须具有实现 IEventActivity 接口作为第一个子活动的活动。有关更多信息,请参见 使用 EventDrivenActivity 活动(可能为英文网页)。

状态机工作流中的主要组成部分是 StateActivity 活动。在状态机工作流中的不同位置捕获了事件时,将会进入不同的状态,以处理与这些事件关联的任务。在工作流的生存期内,工作流可能会离开和进入若干不同的状态。这些状态通过使用 SetStateActivity 活动互相连接。

将新的 StateActivity 拖到工作流设计图面上时,您可以添加 EventDrivenActivity、 StateInitializationActivity、 StateFinalizationActivity 或其他 StateActivity 活动作为子活动。

工作流编程循序渐进(5:状态机工作流)警告:

使用状态机工作流设计器来创建工作流时,推荐使用“文档大纲”视图窗口来监视所设计工作流的结构。“文档大纲”视图窗口中状态机工作流结构的视图反映了工作流标记文件中活动的逻辑布局。工作流活动显示在设计图面上的物理布局可能不会反映工作流标记文件中活动的逻辑布局。

若要打开“文档大纲”窗口,方法有二:(1)在“视图”菜单上指向“其他窗口”,然后选择“文档大纲”;(2)也可以右单击某个状态活动,然后选择“文档大纲”。

例如下面的图形,左边显示的是“文档大纲”,右边是相应的状态工作流。

工作流编程循序渐进(5:状态机工作流)

图片看不清楚?请点击这里查看原图(大图)。

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

请遵循如下步骤创建一个实现简单的请假流程的控制台状态工作流示例程序:

1. 启动VS2008,单击菜单”文件“|”新建“|”项目“,创建一个名字为MyStateWF的控制台状态工作流示例程序。

工作流编程循序渐进(5:状态机工作流)

图片看不清楚?请点击这里查看原图(大图)。

2.之后,系统自动打开工作流设计器界面,如图所示。

工作流编程循序渐进(5:状态机工作流)

图片看不清楚?请点击这里查看原图(大图)。

三、设计状态机工作流3. 从工具箱中依次拖动四个State活动到上面的工作流设计器中。

工作流编程循序渐进(5:状态机工作流)

4. 依次拖动三个eventDriven活动到上图中上面的三个State活动中(最下面的一个不必拖入)。

工作流编程循序渐进(5:状态机工作流)

5.确定各个状态的转换关系。文章开始时提供了两种方法,显然使用拖动手柄法非常简单,结果如下:

工作流编程循序渐进(5:状态机工作流)

图片看不清楚?请点击这里查看原图(大图)。

6.状态1为审批准备阶段。现在,我们来看看具体的准备工作。为此,双击上图状态1中的eventDrivenActivity1,进入到状态1的活动图中。

工作流编程循序渐进(5:状态机工作流)

图片看不清楚?请点击这里查看原图(大图)。

7. 注意到,这里自动添加了SetState活动,这是前面手动拖动手柄的结果。根据开始时的描述,eventDriven活动中的第一个子活动必须为延迟活动。为此,我们作如下修改:

工作流编程循序渐进(5:状态机工作流)

图片看不清楚?请点击这里查看原图(大图)。

因为状态2执行结果存在两种情况,一种是得到批准;另一种是不批准。为此,创建如下的状态2活动:

工作流编程循序渐进(5:状态机工作流)

图片看不清楚?请点击这里查看原图(大图)。

状态3中的活动非常简单,如下图所示:

工作流编程循序渐进(5:状态机工作流)

图片看不清楚?请点击这里查看原图(大图)。

四、设计状态机中各活动的参数及有关函数本实例中,绝大部分的代码活动仅是通过控制台输入简单的提示文字。对于上面的左边的 IfElseBranch活动,在对应的属性对话框中指定Condition为“代码条件”,输入条件方法名为LeaveCondition,按下回车,创建如下代码:

private void LeaveCondition(object sender, ConditionalEventArgs e)
{
    System.Threading.Thread.Sleep(5000);
    string result = Console.ReadLine();
    if (result == "0")
    {
        e.Result = false;
    }
    if (result == "1")
    {
        e.Result = true;
    }
}

下面是分散在几个代码活动中的活动对应的ExecuteCode属性函数的内容:

private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
    Console.WriteLine("这是初始状态,请假流程开始!\n");
    System.Threading.Thread.Sleep(5000);
    Console.WriteLine("开始提交请假申请\n");
}
private void codeActivity2_ExecuteCode(object sender, EventArgs e)
{
    System.Threading.Thread.Sleep(5000);
    Console.WriteLine("收到请假申请,请批示:!\n");
    Console.WriteLine("输入0:不同意请假。\n");
    Console.WriteLine("输入1:同意请假。\n");
}
private void codeActivity5_ExecuteCode(object sender, EventArgs e)
{
    Console.WriteLine("请假申请结束!\n");
}
private void codeActivity3_ExecuteCode(object sender, EventArgs e)
{
    Console.WriteLine("允许请假!");
}
private void codeActivity4_ExecuteCode(object sender, EventArgs e)
{
    Console.WriteLine("不允许请假!");
}

在本例中,我们使用了System.Threading.Thread.Sleep函数,你也可以使用上面流程中的延迟函数进行设置。四、运行实例按F5运行控制台程序,一般顺利的话,将得到如下图所示运行时快照。

工作流编程循序渐进(5:状态机工作流)

图片看不清楚?请点击这里查看原图(大图)。

从图中看出,当输入0时,整个请假流程循环从头操作。当输入1时,请假得到允许,整个流程结束。

补充因为本例中各个状态的名称都是使用汉字表示的,所以,需要把整个状态机工作流的InitialStateName属性更改为“准备”。

工作流编程循序渐进(5:状态机工作流)

图片看不清楚?请点击这里查看原图(大图)。

出处: http://zhuxianzhong.blog.51cto.com/157061/203483

Tags:工作流 编程 循序渐进

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接