什么是工作流呢?这是个比较宽泛的概念,程序都有一个流程,代码也有个序列,只有按照正确有序的序列执行时,才会得到预期的结果。这其实就是工作流,也许我们并没有考虑过在工作使用,但事实上我们已经在无意识的使用了。
工作流是一种不同于传统方式的变成模型,它将工作内容与工作时间,业务逻辑和控制流分离。这就使得更改工作时间并不影响工作内容,定制控制流,并不影响业务逻辑。以前我们是把业务逻辑和执行流都混杂到一段代码,很可能牵一发而动全身。
以上比较抽象的介绍了工作流,下面先介绍一个简单的示例,可以有个直观的了解。遵循新技术的传统,还是从“Hello World ”写起。如果已经有WF的编程经验,直接略过。
首先,新建项目,选择 “Workflow”->“顺序工作流控制台应用程序”,命名为SequentialWorkflowConsole。在新生成的项目中我们会看到“Workflow1.cs”.
双击打开,进入工作流设计器。
从“工具箱”中 Windows Workflow v3.0中添加“Code”
双击“codeActivity1”图标,进入后台事件,添加codeActivity1_ExecuteCode代码。这步就是给活动codeActivity1添加执行的操作,即事件codeActivity1_ExecuteCode。
using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Collections; using System.Drawing; using System.Linq; using System.Workflow.ComponentModel.Compiler; using System.Workflow.ComponentModel.Serialization; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.Runtime; using System.Workflow.Activities; using System.Workflow.Activities.Rules; namespace SequentialWorkflowConsole { public sealed partial class Workflow1 : SequentialWorkflowActivity { public Workflow1() { InitializeComponent(); } private void codeActivity1_ExecuteCode(object sender, EventArgs e) { Console.WriteLine("Hello World!"); } } }
现在,整个工作流基本上已经完成了。但是这是个控制台程序,没有界面,运行会发现,一闪而过,看不出效果,下面我们添加两行。
找到programe.cs,双击打开,进入后台代码
namespace SequentialWorkflowConsole { class Program { static void Main(string[] args) { using(WorkflowRuntime workflowRuntime = new WorkflowRuntime()) { AutoResetEvent waitHandle = new AutoResetEvent(false); workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();}; workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e) { Console.WriteLine(e.Exception.Message); waitHandle.Set(); }; WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(SequentialWorkflowConsole.SeqWorkflow)); instance.Start(); waitHandle.WaitOne(); //添加这两行,使控制台等待 Console.WriteLine("Press any key to continue..."); Console.ReadLine(); } } } }
下面简单介绍下,后续章节会详细介绍。
1、WorkflowRuntime工作流运行时引擎,监视和控制工作流。
2、AutoResetEvent:
AutoResetEvent(bool initialState):释放单个等待线程的线程同步类。 false:无信号,子线程的WaitOne方法不会被自动调用 true:有信号,子线程的WaitOne方法会被自动调用
方法:
Reset ():将事件状态设置为非终止状态,导致线程阻止;如果该操作成功,则返回true;否则,返回false。 Set ():将事件状态设置为终止状态,允许一个或多个等待线程继续;如果该操作成功,则返回true;否则,返回false。
WaitOne() 当在派生类中重写时,阻止当前线程,直到当前的 WaitHandle 收到信号。
3、WorkflowRuntime工作流实例。
4、waitHandle.WaitOne() 主线程等待,直到接收到Set()信号,这里Set()在工作流事件完成或终止事件中。
现在可以运行下,O了。很简单,效果图我就不贴了。