快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

澳门24小时娱乐在线打造_龟发之家论坛



这是实际生活中的一个状态机的例子:“门”。这个例子是Mebyon Kernow写的,应用状态机对门的状态进行节制,我感觉是进修WF4.0中状态机的好例子。以是,简单的翻译了他这篇文章。盼望对你进修WF4.0的状态机有所赞助。以下是正文。原文是:A practical State Machine example

------------------------------------------------------正文瓜分线------------------------------------------------------------

现在,状态机的活动已经宣布在Codeplex上面了(详见:http://wf.codeplex.com/)。我找出一个常常应用的例子。用这个例子用来演示若何应用状态机来节制一个修建物的收支(节制修建物的门),以及展示一下状态机活动包中的主要功能。

这个例子的模型是对门的节制。宿主是一个WPF利用法度榜样(WPF可以实现一些对照好的样式!)。想象一下,假如你去'开启'一个修建物。此时,每一个门都是关闭或者锁住的,这形成这个例子中状态机初始化的状态。是以,在状态机中我们必要等待一个事故触发来对门解锁,现实中可能要应用密码键盘或智能卡去开锁。这个例子的状态机的State和Transition如下图所示:

当用户供给自己的凭证来触发上图中的名字为Unlocked的Transition-这里你可能必要你通报PIN号码(或者卡上的号码)给Transition ,然后再查询数据库进行验证。这个例子中为了简单起见,没有任何验证。

从ClosedLocked状态出来,会存在三种可能性。一种是用户打开门;一种是由于一些缘故原由又锁上门;一种是可能是他没有打开门,一段光阴过后自动锁上门,回到ClosedLocked状态。在这个状态上有三个Transition被履行,此中两个是等到事故发生,第三种是用了一个Delay 活动,光阴设置为5秒钟。下面,我将会对State 和Transition进行解释,它们对理解状态机若何运作是至关紧张的。

States & Transitions

一个状态机由State的聚拢和State之间的transition聚拢构成的。必须有一个初始状态,可以选择是否有一个停止的状态(完成了事情流实例履行),当你进入一个State,你可以履行一些活动,同样在退出一个State,的时刻,还可以履行一些活动澳门24小时娱乐在线打造。要定义的Entry和Exit的活动,双击State ,设计将显示如下所示...

履行State活动的时刻先履行Entry活动(它可所以一个Sequence ,这样你就可以运行多个活动了)。接着是去探求出这个State所有的Transition。然后,履行每个Transition,这在我的状态机例子中在活动履行中创建了书签,然后等待规复这个书签。这彷佛有些稀罕。假如你有3个Transition,我们就要要为这三个分支设计触发的活动。着实状态机的引擎只需等澳门24小时娱乐在线打造待这些活动的一个完成,谁先谁履行,只要一个触发完成,这样Transition就完成了。

理解Transition最简单的要领是把它算作一个Pick活动看待。当状态机处在一个给定的状态,我们去履行每一个Transition的要领类似于 Pick活动处置惩罚要领,此中一个活动最先完成,Transition就完成。你可以在Transition上设置一些前提。这个时刻,只有事故触发而且前提返回为True的时刻,Transition才会完成。在ClosedLocked状态中,Transition类似于下图所示:

上图中,我省略了Action,Transition分支和Pick活动轻细不合的地方。当Transition的触发活动完成后,假如有创建Action活动,也将会履行Action活动(假设前提返回为true)。

以是,在State中我们正等待一个活动的完成。在上图中有一个自定义活动:DoorUnlocked和DoorLocked活动。他们都是DoorEvent活动的实例,是由客户端规复的书签。这项活动的代码是相称简单,如下...

public澳门24小时娱乐在线打造 class DoorEvent : NativeActivity

{

protected override bool CanInduceIdle

{

get { return true; }

}

[RequiredArgument]

public InArgumentstring> BookmarkName { get; set; }

protected override void Execute(NativeActivityContext context)

{

context.CreateBookmark(BookmarkName.Get(context), new BookmarkCallback(OnBookmarkResumed));

}

private void OnBookmarkResumed(NativeActivityContext context, Bookmark bookmark, object state)

{

}

}

它有一个需要的BookmarkName属性,用来定义的书签的名称。在这个例子中,书签的名称和Transition的标签相同。澳门24小时娱乐在线打造

在WPF中宿主

这个例子中宿主在WPF中,并应用MVVM模式(这里只有一个View模型)来掩护用户界面。该用户界面必要知道现在状态机是什么状态,这样才能规复精确的书签,是以在每一个State的活动中我应用别的一个自定义活动将状态机的状态通报出来供View模型应用。这个状态将更新的View模型上的属性。

在这个例子中,在视图模型中应用了一些类 - MainViewModel类是利用法度榜样的父类,它包孕一组DoorModel实例,此中的一个表示UI上的一道门。当DoorModel创建时,将创建 WorkflowApplication实例,并添加一个扩展到WorkflowApplication实例中(IDoor),这个扩展由 DoorModel实现。当看护模型状态改变时,恰是这种扩展,事情流将回到DoorModel中。该系统的伪代码如下所示...

1、DoorModel实例被创建。设置它的名称(显示在屏幕上)。

2、在一个WorkflowApplication实例中创建一个状态机实例。

3、状态机启动,并急速履行的第一个State活动'ClosedLocked'。这将先履行SetDoorState活动,并调用IDoor.SetState(),并给措施通报一个罗列值来阐明状态机是什么状态 。

4、根据事情流的状态,应用enable/disable敕令更新用户界面。

此后,用户界面认真治理状态机。当一个敕令,如'Unlock’被履行的,它只要在状态机中规复精确的书签...

_unlockCommand = new DelegateCommand((unused) =>

{

_stateMachine.ResumeBookmark("Unlocked", null);

},

(unused) =>

{

return this.DoorState == DoorState.ClosedLocked;

});

在这里我应用的一个DelegateCommand类,这样我可以应用lambda函数相应敕令了。

当用户点击用户界面,履行响应的敕令来恢回信签,完成流程中的一个Transition。进入一个新的状态,回调到视图模型,孕育发生新的状态。

我还想阐明的这个利用法度榜样澳门24小时娱乐在线打造的例外一部分。在每一个Transition中应用了自定义的PlaySound活动。当Transition完成的时刻,发出简单的声音来表示门的状态。这个例子中,当超时的时刻,发出一种声音。别的一种是门被锁上的时刻发出别的一种声音。最初,我将声音定义在State活动的 ‘Entry’ 元素上面。这不能阐明到底是哪一个transition是刚刚触发的。即有没有法子区分状态机是从哪一个Transition进入 ClosedLocked中的,也就不能播放不合的声音进入该活动了。

当您运行该利用法度榜样你会看到下面的UI ...

假如你点击Unlock 按钮,就会履行事情流,改变状态为ClosedUnlocked。你还会看到一组对应于现在有效状态((Lock和Open)按钮显示假如你解锁一道门,然后脱离约5秒钟,门会自动再次锁上。对付所有的Transition,您可以听到一些声音 - 假如你听不到声音,反省每一个Transition的PlaySound活动和选择自己的文件播放(我在Windows 7文件目录可能会和你的机子不合)。

代码:http://files.cnblogs.com/zhuqil/Doors.rar

转自:http://www.cnblogs.com/zhuqil/archive/2010/06/26/a-practical-state-machine-example.html

您可能还会对下面的文章感兴趣: