天很蓝,应该不会下雨
(注:标题与文章内容无关)
昨天朋友让我概括一个工作流状态机模式的开发应用,我想.............想........想..........
对他说"大富翁,用工作流的状态机模式开发大富翁游戏应该不错"
最后,我得出一个结论,MS发布WCF,WPF,WF,一定是为他下一代的网络版,界面漂亮的大富翁游戏做准备
昨天发了一个例子入门篇(1):介绍WWF,调试时注意引擎加载SqlWorkflowPersistenceService服务的以下特点
WorkflowRuntime与PersistenceService以一种松散藕合的方式工作。
SqlWorkflowPersistenceService作为一个PersistenceService的功能实现类加载到WorkflowRuntime中为引擎提供了一种使用SQLServer数据实现持久化的功能。
1.每当引擎起动时(StartRuntime),只要InstanceState表中有实例数据,就会将该实例载入引擎中,并将ownedUntil字段设为加载的时间
2.每当引擎停止时(StopRuntime),就会将引擎内的所有工作流实例存入InstanceState表,ownedUntil字段为空
注:没加载SqlWorkflowPersistenceService服务时,引擎停止后,引擎并没有释放,引擎中的实例也存在,只是所有的执行都被系统级挂起,当重新启动引擎时,所有的实例还可继续运行
3.实例在挂起状态时(如:实例.Suspend),如调用UnLoad方法,status值为2,unlocked值为1,blocked值为0,info值为Suspend方法的参数,modified为操作的时间,nextTimer为9999-12-31 23:59:59.997
4.实例在引擎中创建后,还没开始执行前,如调用Unload方法,status值为4,info值为空其他同上。
5.实例在运行到Delay结点的idle状态时,如调用Unload方法,status值为0,unlocked值为1,blocked值为1,nextTimer值为实际Delay应苏醒的时间。
SqlWorkflowPersistenceService会不停的刷InstanceState表,发现有状态为Delay的实例,则nextTimer小于当前时间,就执行他。
所以,持久化Delay状态的实例,不用人为加载运行,SqlWorkflowPersistenceService服务会自动运行的。
6.引擎.GetWorkflow(GUID)方法可以返回一个引擎中存在的实例,
如果引擎中不存在,SqlWorkflowPersistenceService服务会到数据库中找该实例,并将其加载到引擎
如果引擎中没有指定GUID的实例,会报Workflow with id "GUID" not found in state persistence store.
如没加载SqlWorkflowPersistenceService服务报的异常为The workflow hosting environment does not have a persistence service as required by an operation on the workflow instance
7.没有加载SqlWorkflowPersistenceService时, 实例的TryUnload方法会报异常。
8.没有经过持久化的实例,调用load方法不会出错,也不产生引擎的WorkflowLoaded事件
9.加载的持久化实例不用load方法也能直接操作,但这样不会产生引擎的WorkflowLoaded事件,调用load方法可以产生引擎的WorkflowLoaded事件,除此之外,我没跟出什么其他的
10.引擎没正常退出时,ownedUntil字段不会改为空,但不会响应下次的引擎的正常启动,仍按方式[1]启动
11.已被持久化的实例,Delay状态的实例,在到时后会被刷回引擎,其他状态的实例不会被刷回引擎
12.引擎运行时,InstanceState表并没有上锁,因此可以多个引擎同时作用于同一实例表
13. status的值在其他文提过,自已跟完猜一下也行
另外,为这几天的文章写一个目录文章小结 ,以我的智商能写出这东西真的不容易,我在自已电脑上找资料总是全盘查找 *.doc .以前做的那些项目竞然还没崩,真是奇怪
十一到了,祝大家新年快乐