在VS9里面,可以通过 New > Project > Wokkflow > Sequential Workflow Library 建立一个顺序流程的工作流工程。

VS9建立一个默认的工作流对象Workflow1,通过左侧的Toolbox就可以设计工作流了。简单得很,我们现在做一个详细设计到单元测试的工作流,详细设计需要Review,代码走查是可选的工作,他们和单元测试都是只有通过了才能进入下一阶段。直接看图。

而对于工作流里面的关键工作和判断,都需要在代码中给与实现,比如详细设计Review,首先需要实现是否通过Review的实现。
选择DsReviewNG这个While类型的工作流单元,在Property Window里面可以看到一个Condition属性,他就是我们要实现的具体操作。选择Code Condition表示通过代码实现,然后写入函数名称(很想为Event Handle函数那样),VS9将会自动跳转到代码页生成我们需要的代码。

注意第二个参数ConditionalEventArgs,他的属性Result负责返回这个判断的结果给工作流。所以我们的判断结果要赋给这个变量。






在建立一个Project,可以使ConsoleApplication,引入刚才这个工作流的Project Reference和System.Workflow.Activities、System.Workflow.ComponentModel和System.Workflow.Runtime。为了好看,建立一个新的类来执行工作流。











































但是为什么还需要waitHandler.Set()、waitHandler.WaitOne()等这些操作呢?因为默认的,工作流将会使用一个新的线程执行。为了让主线程能够等待工作流的结束,这里是用了一个.Net Fx3里面新的类System.Threading.AutoResetEvent。目前的MSDN对这个类介绍很少,我个人的理解是它可以将当前进程里面的主线程挂断,然后运行子线程,直到子线程结束之后释放主线程。
具体的介绍可以看MSDN的相关部分。
运行起来就是这个样子的……

红框里面的部分就是工作流的输出。
对于工作流,本人只是开始接触,这个例子主要是根据 netfx3 上面 Sudoku 的一部分做的。对于WWF还有很多不清楚的地方,比如WWF里面的数据怎么和调用方交互,可能就要用到ExternalDataExchangeService了。而且对于AutoResetEvent仍然不是很明白。这个立即在运行的时候,有可能会出现工作流没有正常启动的情况,多次运行就会正常。但是究竟是什么原因,我感觉是AutoResetEvent使用不当造成的。也欢迎有相关经验的高人指点一二。
源代码下载(适用于Visual Studio Orcas Beta 1)
参考资料
Sudoku( http://wcf.netfx3.com/files/folders/distributed_applications/entry4543.aspx)