工作流内部工作原理(三)

Workflow Foundation Internals (III)
Andrew Au

接续上一篇,我们会允许有多个Activity同时被Schedule,换句话说,就是某程度上的并行处理。这情况其实很普遍,比如说多人需要审批一份文档。上一次我们发现ScheduleActivity只能被调用一次,那麽明显的解决方桉就是允许一个States上可以有很多的Delegates。看着states.Frames,我们过往的实现都只会盯着最上层的一个Frames,但是在并行的情况下这样就不成了。我们需要一个像Stack一样,但是有很多个顶的一个数据结构,想一想,这不就是一颗反过来的树吗?我们会在数据结构上放这个棵树所有的叶,然后用父指针去找它的Parent Frame。当我们有很多的叶的时候,只有States就不够了。Activity.Execute将无法知道它应该是在那一个Frame上跑,所以我们要把Execute的参数从States改成Frame,这样的话其它就会变得简单了。

7-to-8

代碼示例:Version 8

我们还是在使用以前的Activity,这只不过是为了安全起见,我们没有使用并行。现在我们使用并行了,最简单的就是Parallel,它只会Schedule两个Read。

8-to-9

代碼示例:Version 9

留意工作还是单线程的在执行。Parallel只不过允许多份工作同时在等着而已。当这些工作实际上是在等外界输入,那它们就是在同时等待。在上一个版本,我们每一个Delegate的先决条件都是Frame,但是很多时候有些工作不能完成不是因为其它工作还没完成,而只不过是它所需要的资料还没到而已。这些资料到最终还是从主程序中获得。我们可以通过States去通知主程序去接收资料,到资料收到的时候,主程序便能执行正在等待数据的工作了。WF3使用Queue的方式去等待数据,但我们发现很多时候我们只需要一个数据项,所以WF4使用了Bookmark。

9-to-10

代碼示例:Version 10

到这里我们就结束我们这旅程了。当然,要做到像今天的WF4还有很漫长的路,但是我希望通过这几篇,大家可以瞭解WF的使计,并可以好好的把它运用到实际场景里,谢谢。

HomeMadeWF.zip