Windows Workflow Foundation 使用小例
2007-06-28 11:18
435 查看
Windows Workflow Foundation(以下简称WWF)为我们提供了一种定义工作流的方式,依靠Visual Studio Orcas Beta 1(以下简称VS9),可以通过图形界面定义一个业务的工作流程,进而在代码页实现工作流的工作细节。使用工作流的时候只需要简单的启动这个流程就可以了。如果工作流发生了变化,那么只需要修改工作流Project里面的流程或者实现,对于工作流的使用者来说不用修改代码。
在VS9里面,可以通过 New > Project > Wokkflow > Sequential Workflow Library 建立一个顺序流程的工作流工程。
private void IsDsReviewNg(object sender, ConditionalEventArgs e)
public class WfExecutor
{
private WorkflowRuntime wfr;
private ExternalDataExchangeService edes;
private System.Threading.AutoResetEvent waitHandler;
public WfExecutor()
{
wfr = new WorkflowRuntime();
edes = new ExternalDataExchangeService();
wfr.AddService(edes);
waitHandler = new System.Threading.AutoResetEvent(false);
wfr.Started += delegate { Console.WriteLine("WorkflowRuntime is started."); };
wfr.Stopped += delegate { Console.WriteLine("Workflow is stroped."); };
wfr.WorkflowTerminated += delegate { waitHandler.Reset(); };
}
public void Execute()
{
wfr.StartRuntime();
WorkflowInstance ins = wfr.CreateWorkflow(typeof(UsingWF.Workflow1));
waitHandler.Set();
ins.Start();
waitHandler.WaitOne();
wfr.StopRuntime();
waitHandler.Reset();
waitHandler.Close();
}
}
其中还有很多我也不是很清楚的东西。目前来讲,为了使用工作流,首先要建立一个WorkflowRuntime,我的感觉像是一个负责运行工作流的平台。还需要一个数据交换服务ExternalDataExchangeService。但是不知道为什么需要。最后通过WorkflowRuntime的CreateWorkflow方法建立我们的工作流对象。(肯定是通过反射建立出来的。)执行Start方法就可以启动工作流了。可以看出,启动工作流和工作流本身没有任何关系,所以修改了工作流也不需要修改调用端的代码。
但是为什么还需要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)
在VS9里面,可以通过 New > Project > Wokkflow > Sequential Workflow Library 建立一个顺序流程的工作流工程。
private void IsDsReviewNg(object sender, ConditionalEventArgs e)
public class WfExecutor
{
private WorkflowRuntime wfr;
private ExternalDataExchangeService edes;
private System.Threading.AutoResetEvent waitHandler;
public WfExecutor()
{
wfr = new WorkflowRuntime();
edes = new ExternalDataExchangeService();
wfr.AddService(edes);
waitHandler = new System.Threading.AutoResetEvent(false);
wfr.Started += delegate { Console.WriteLine("WorkflowRuntime is started."); };
wfr.Stopped += delegate { Console.WriteLine("Workflow is stroped."); };
wfr.WorkflowTerminated += delegate { waitHandler.Reset(); };
}
public void Execute()
{
wfr.StartRuntime();
WorkflowInstance ins = wfr.CreateWorkflow(typeof(UsingWF.Workflow1));
waitHandler.Set();
ins.Start();
waitHandler.WaitOne();
wfr.StopRuntime();
waitHandler.Reset();
waitHandler.Close();
}
}
其中还有很多我也不是很清楚的东西。目前来讲,为了使用工作流,首先要建立一个WorkflowRuntime,我的感觉像是一个负责运行工作流的平台。还需要一个数据交换服务ExternalDataExchangeService。但是不知道为什么需要。最后通过WorkflowRuntime的CreateWorkflow方法建立我们的工作流对象。(肯定是通过反射建立出来的。)执行Start方法就可以启动工作流了。可以看出,启动工作流和工作流本身没有任何关系,所以修改了工作流也不需要修改调用端的代码。
但是为什么还需要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)
相关文章推荐
- 使用windows workflow foundation 并发布为webservice
- windows workflow foundation在WebApplication中的应用,使用StateMechineWorkflow
- [转帖]Windows Workflow Foundation之旅(八)——使用活动控制流程、在工作流中使用条件
- 跟我一起学Windows Workflow Foundation(5)-----使用activity设计器创建一个整合的定制activity
- WinFX 工作流:使用 Windows Workflow Foundation 的声明性模型简化开
- 使用Windows WorkFlow Foundation
- 使用 Windows Workflow Foundation 构建状态机[转]
- 跟我一起学Windows Workflow Foundation(5)-----使用activity设计器创建一个整合的定制activity
- 跟我一起学Windows Workflow Foundation(5)-----使用activity设计器创建一个整合的定制activity(转)
- Windows Workflow Foundation (wwf) 在宿主中使用参数与实例通信 --学习笔记(二)
- 跟我一起学Windows Workflow Foundation(3)-----使用If/Else活动,定制活动处理工作流,使用事件传递数据
- Windows Workflow Foundation之旅(八)——使用活动控制流程、在工作流中使用条件
- 跟我一起学Windows Workflow Foundation(4)-----使用Listen,Delay,和其他envnt-based定制活动(转)
- Windows WorkFlow Foundation 入门之二(使用WF开发介绍)
- 跟我一起学Windows Workflow Foundation(4)-----使用Listen,Delay,和其他envnt-based定制活动
- Windows WorkFlow Foundation 入门之三(在工作流中使用事务)
- 跟我一起学Windows Workflow Foundation(3)-----使用If/Else活动,定制活动处理工作流,使用事件传递数据
- 跟我一起学Windows Workflow Foundation(4)-----使用Listen,Delay,和其他envnt-based定制活动
- 跟我一起学Windows Workflow Foundation(5)-----使用activity设计器创建一个整合的定制activity
- 跟我一起学Windows Workflow Foundation(3)-----使用If/Else活动,定制活动处理工作流,使用事件传递数据