VS2008Workflow的基本概念和简单应用(control)源代码文件:HelloWorkFlow.zip所谓WF,就是.NETFramework3.0的一个构成部分——WindowsWorkflowFoundation。工作流(workflow)是为了完成一些预定的目的,根据一组规则,而制定的一系列步骤。对于一个开发者来说,workflow则是将复杂的业务规则以及控制流程以图形化的方法声明出来,组成一个高度可视化的图形环境。Workflow又不仅仅是一个开发环境,它还代表着一种不同的编程模型。它是一种能够更清晰的分离“whattodo”以及“whentodoit”的模型,这种分离可以使得我们能够在不影响what的情况下去改变when。Workflow模型在解决人类交际问题的时候能够起到很瘧的作用~~Microsoft提供了WindowsWorkflowFoundation来简化和增强.NET开发。它不是一个独立的应用程序,而是一个能够在我们的应用程序中启用workflow模型的设计。下面有一些使用它的好处,呵呵,我就不进行翻译了。Itprovidesaflexibleandpowerfulframeworkfordevelopingworkflows.Youcanspendyourtimeandenergydevelopingyourownframework,visualworkflowdesigner,andruntimeenvironment.OryoucanuseafoundationthatMicrosoftprovidesandspendyourvaluabletimesolvingrealbusinessproblems.Itpromotesaconsistentwaytodevelopyourapplications.Oneworkflowlooksverysimilartothenext.Thisconsistencyintheprogrammingmodelandtoolsimprovesyourproductivitywhendevelopingnewapplicationsandmaintainingexistingones.Itsupportssequentialandstatemachineworkflows.Sequentialworkflowsaregenerallyusedforsysteminteractions.Statemachineworkflowsarewell-suitedtosolvingproblemsthatfocusonhumaninteraction.Itsupportsworkflowpersistence.Theabilitytosaveandlaterreloadthestateofarunningworkflowisespeciallyimportantwhenmodelinghumaninteractions.Itsupportsproblemsolvingusingadomain-specificmodel.Microsoftencouragesyoutodevelopyourowncustomactivitycomponents.Eachcustomcomponentaddressesaproblemthatisspecifictoyourproblemdomainandusesterminologythatiscommontothedomain.Itprovidesacompleteworkflowecosystem.Inadditiontotheworkflowruntimeitself,Microsoftalsoprovidesasuiteofstandardactivities,workflowpersistence,workflowmonitoringandtracking,andaworkflowdesignerthatisintegratedwithVisualStudiowhichyoucanalsohostinyourownapplications.Itisfreeofcharge.BecauseofthisanditstightintegrationwithVisualStudio,itwillbecomethedefactostandardworkflowframeworkforWindowsdevelopers.AgrowingcommunityofotherWFdevelopersisalreadyinplace.Theyarealreadysharingtheirideas,theircustomactivitycomponents,andothercode.开发环境最好的选择是VisualStudio2008RTM。当然,使用VS2005也是可以的。详细的列表如下:VisualStudio2005TeamSystem,Enterprise,Professional或者Standard版本。Express版无效;.NETFramework3.0WindowsSDK6.0WindowsWorkflowadd-inforVisualStudio除了第一个需要购买,其余三个都可以在MS的官方网站上下载得到。在我的整个WF读书笔记之中,均是采用VisualStudio2008beta2Professional为运行环境(目前它是免费的^_^)。HelloWorkflow我们学习任意一项新的编程领域的时候都会引入经典的HelloWorld程序,在这里也不例外。我们就以“HelloWorkflow”来开始我们的WF之旅~~启动VS2008,File-New-Project,选择如图所示的SequentialWorkflowConsoleApplication并给它选择一个路径,点击确定。初始化完毕之后,请展开SolutionExplorer中的References项,其中WF所必须的引用程序集有:System.Workflow.ActivitiesSystem.Workflow.ComponentModelSystem.Workflow.Runtime项目模板建立了一个叫做Program.cs的文件。由于我们建立的是一个控制台程序,这个文件包含一个Main方法,作为程序的入口。下面我们再来看看workflow的设计器。它看起来很像我们早期设计算法的时候采用的流程图,有开始和结束两个端点。这个设计器就像一个“画布”,我们在它的上面“绘制”我们的workflow。当然我们也可以完全以代码的形式来完成这些工作,但那无疑是低效而且落后的。从Toolbox中我们可以用拖放的方式,将一个个activity补充到workflow画布上来。所谓的activity,就是标志着工作流中的一个步骤,它也是构造WF工作流的砖瓦。所有的activity都是直接或间接派生自System.Workflow.ComponentModel.Activity基类。MS提供了一组标准的activity供我们使用,但我们也可以随心所欲自己定义新的activity来。这个例子中的工作流是顺序工作流(sequentialworkflow),因而activity的顺序就决定了它们被执行的次序。请从Toolbox中拖动一个CodeActivity,放置在工作流中。实际中它的类名是CodeActivity,这个实例的名字默认是codeActivity1。在右上角应该有一个红色的惊叹号,这表明有一些必要的属性没有被设置。点击它我们可以看到“PropertyExecuteCodeisnotset.”这样的错误信息,我们需要为它设置合适的值。在属性窗口中,找到它的ExecuteCode,填入codeActivity1_ExecuteCode并回车(也可以直接双击这个属性的名字),一个空的事件句柄就被创建了,并且Workflow1.cs也会随之打开。为这个事件添加如下的代码:Console.WriteLine(HelloWorkflow!);如此,这个CodeActivity的执行代码就搞定了。让我们再打开Program.cs,可以看到Main方法中已经添加了一串代码。关于它的解释请自行参阅MSDN,里面用到了不少.NET3.0的新特性(比如匿名委托这样的)。我们在Main方法的结尾添加下面的两行代码:Console.WriteLine(PressENTERtoexit);Console.ReadLine();按下F5,看看执行的结果吧^_^传递参数(PassingParameters)如果一个工作流不能接受外接参数输入的话,那它的功能就太圡了。将参数传送进工作流也是一项最基本的WF技能,使得我们可以从外界影响工作流的工作。下面我们改进一下HelloWorkflow程序,让它能够接受外界的参数,变成一个“susan说”~~~首先,我们需要在workflow类里添加可写属性。打开Workflow1.cs的代码,将Workflow1类的代码改写如下:publicsealedpartialclassWorkflow1:SequentialWorkflowActivity{privatestring_person=string.Empty;privatestring_message=string.Empty;///summary///Thetargetofgreeting////summarypublicstringPerson{get{return_person;}set{_person=value;}}///summary///Thegreetingmessage////summarypublicstringMessage{get{return_message;}set{_message=value;}}publicWorkflow1(){InitializeComponent();}privatevoidcodeActivity1_ExecuteCode(objectsender,EventArgse){//DisplaysthevariablegreetingConsole.WriteLine({0}said:{1},_person,_message);}此时的工作流就可以接受Person和Message两个入口参数(注意,入口参数的名称与定义的属性名必须完全一致紧接着,我们需要在运行时(runtime)调用此workflow的时候为其参数赋值。打开Program.cs,添加下面加粗的部分代码。usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Threading;usingSystem.Workflow.Runtime;usingSystem.Workflow.Runtime.Hosting;namespaceHelloWorkFlow{classProgram{staticvoidMain(string[]args){using(WorkflowRuntimeworkflowRuntime=newWorkflowRuntime()){AutoResetEventwaitHandle=newAutoResetEvent(false);workflowRuntime.WorkflowCompleted+=delegate(objectsender,WorkflowCompletedEventArgse){waitHandle.Set();};workflowRuntime.WorkflowTerminated+=delegate(objectsender,WorkflowTerminatedEventArgs