<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Workflow (WF)</title>
        <link>http://blog.entlib.com/EntLib/category/11.aspx</link>
        <description>Windows Workflow Foundation</description>
        <language>zh-CN</language>
        <copyright>EntLib.com</copyright>
        <managingEditor>entlib@hotmail.com</managingEditor>
        <generator>EntLib.com Blog Version 3.0.0.0</generator>
        <item>
            <title>WF 状态机工作流构建订单处理流程-范例程序分析 Part 2</title>
            <link>http://blog.entlib.com/EntLib/archive/2009/06/02/wf-part-2.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;WF &lt;/b&gt;&lt;b&gt;状态机工作流构建订单处理流程-&lt;/b&gt;&lt;b&gt;范例程序分析 Part 2&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;状态机工作流（State Machine Workflow）是以状态的变化为驱动而进行业务流转的，且一定需要人为的干预，而不像顺序类型工作流（Sequential Workflow）那样按照事先设计好的业务流程一步一步依次执行下去。本范例程序由&lt;a href="http://forum.entlib.com/"&gt;http://forum.entlib.com&lt;/a&gt; 开源ASP.NET/C# 论坛小组提供。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://blog.entlib.com/EntLib/archive/2009/03/23/wf-part-1.aspx"&gt;WF &lt;span&gt;&lt;span&gt;状态机工作流构建订单处理流程&lt;/span&gt;-&lt;span&gt;范例程序分析&lt;/span&gt; Part 1&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;实现IOrder &lt;/b&gt;&lt;b&gt;接口&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;下面实现IOrder 接口，下面的代码Order类实现IOrder 接口。这里，仅仅在控制台显示一些简单的提示信息。该Order类将由Client端程序调用，其中内部的调用，将触发工作流中相应的活动。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="609" height="318" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_Part2_1.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;创建工作流实例&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;下面基于workflow runtime 创建并启动工作流实例，并添加Order 对象作为服务。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;WorkflowInstance&lt;/span&gt; objWorkFlowInstance;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;WorkflowRuntime&lt;/span&gt; objWorkFlowRuntime = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WorkflowRuntime&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; objOrder = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ExternalDataExchangeService&lt;/span&gt; objService = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ExternalDataExchangeService&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt; InstanceId = &lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt;.NewGuid();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            objWorkFlowRuntime.AddService(objService);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            objService.AddService(objOrder);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            objWorkFlowInstance = objWorkFlowRuntime.CreateWorkflow(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(OrderWorkFlow.&lt;span style="color: #2b91af"&gt;WorkflowOrder&lt;/span&gt;), &lt;span style="color: blue"&gt;null&lt;/span&gt;, InstanceId);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            objWorkFlowInstance.Start();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;工作流启动啦 -- Work flow started"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下面是Client端调用代码，根据用户输入的数值，调用Order 对象的相应方法，触发工作流中相应的活动。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ExternalDataEventArgs&lt;/span&gt; objDataEventArgs = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ExternalDataEventArgs&lt;/span&gt;(InstanceId);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            objDataEventArgs.WaitForIdle = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"1 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;订单尚未付款"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"2 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;产品入库"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"3 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;对订单付款"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"4 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;订单发货"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"5 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;送货地址错误"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"6 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;送货地址正确"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"7 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;产品有库存"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;请输入上述数字： "&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;int&lt;/span&gt; intValueEntered=0;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;while&lt;/span&gt;(intValueEntered &amp;lt; 7)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                intValueEntered = &lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.ToInt16(&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadLine().ToString());&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 1)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallNotPaid(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 2)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallInStock(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 3)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallPaymentMade(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 4)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallDispatch(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 5)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallAddressNotProper(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 6)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallAddressCorrected(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 7)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallProductStocked(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;该工作流演示界面如下：&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="677" height="440" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_Part2_2.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;欢迎下载该范例程序源代码。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/192.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/06/02/wf-part-2.aspx</guid>
            <pubDate>Tue, 02 Jun 2009 11:43:20 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/192.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/06/02/wf-part-2.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/192.aspx</wfw:commentRss>
            <enclosure url="http://blog.entlib.com/userfiles/EntLib/file/EntLib_OrderWorkFlow.zip" length="111" type="application/octetstream" />
        </item>
        <item>
            <title>WF 状态机工作流构建订单处理流程-范例程序分析 Part 1</title>
            <link>http://blog.entlib.com/EntLib/archive/2009/03/23/wf-part-1.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;WF &lt;/b&gt;&lt;b&gt;状态机工作流构建订单处理流程-&lt;/b&gt;&lt;b&gt;范例程序分析 Part 1&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;状态机工作流（State Machine Workflow）是以状态的变化为驱动而进行业务流转的，且一定需要人为的干预，而不像顺序类型工作流（Sequential Workflow）那样按照事先设计好的业务流程一步一步依次执行下去。本范例程序由&lt;a href="http://forum.entlib.com/"&gt;http://forum.entlib.com&lt;/a&gt; 开源ASP.NET/C# 论坛小组提供。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;State活动有3种类型的状态：起始状态（Initial State）、业务逻辑过程状态、终止状态（Completed State），在一个状态机工作流中起始状态和终止状态只能有一个。状态机工作流是从起始状态开始执行，在运行过程中通过业务逻辑状态的变化来进行工作流的流转，最终由终止状态标志工作流的结束。因此在状态机工作流设计界面上只能添加 State 状态活动，另外，在该状态中还可以添加一个或多个EventDriven 活动。下面通过一个订单处理流程的范例，详细介绍状态机工作流的使用。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下图简要描述了订单处理流程，你会发现许多地方需要用户参与或输入，来改变工作流。例如，财务部门依赖于支付情况来改变工作流，采购部门依赖于库存情况来改变工作流等等。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img height="443" alt="" width="690" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_1.gif" /&gt; &lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;按照下面具体的操作步骤，一步一步实现上述状态机工作流演示程序。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;1. &lt;/b&gt;&lt;b&gt;创建接口程序&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;由于状态机工作流中大量使用HandleExternalEvent 活动来接收应用程序的操作事件，从而改进该工作流上运行的业务实体的状态，因此需要定义一个接口程序作为工作流和应用程序之间沟通的桥梁。本范例程序中将通过接口中的7个事件来模拟状态机工作流的触发，接口IOrder.cs 如下所示。需要注意的是：我们引用System.Workflow.Activities，并且接口添加了[ExternalDataExchange]属性。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img height="373" alt="" width="684" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 创建Class Library项目，并添加State Machine Workflow（状态机工作流）文件。如下图所示。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img height="465" alt="" width="690" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_3.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;在添加State Machine Workflow文件后，Workflow设计器自动打开。工作流的每一个State都有事件，因此在State Activity 添加EventDriven组件。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img height="363" alt="" width="549" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_4.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;在事件Event触发后，State状态进入下一个状态。因此，双击EventDriven组件，添加HandleExternalEvent组件和SetState组件，其中HandleExternalEvent定义监听的事件，SetState定义将进入的下一个状态。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img height="445" alt="" width="690" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_5.gif" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img height="431" alt="" width="690" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_6.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;按照上面的步骤，重复创建OrderPlaced、OrderApproved、OrderPending、OrderDelivered、OrderCancelled状态，并添加相应的EventDriven组件，最终实现的状态机工作流如下所示：&lt;/div&gt;
&lt;div style="text-align: center"&gt;  &lt;img height="474" alt="" width="680" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_7.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/157.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/03/23/wf-part-1.aspx</guid>
            <pubDate>Sun, 22 Mar 2009 17:32:29 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/157.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/03/23/wf-part-1.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/157.aspx</wfw:commentRss>
        </item>
        <item>
            <title>简要分析WF 状态机工作流的部分代码</title>
            <link>http://blog.entlib.com/EntLib/archive/2009/03/21/wf-again.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;简要分析WF &lt;/b&gt;&lt;b&gt;状态机工作流的部分代码&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;这里简要分析WF 状态机工作流的部分代码。&lt;/div&gt;
&lt;div&gt;首先，看看下面的代码：&lt;/div&gt;
&lt;div align="left"&gt;    public class clsOrder : IOrder&lt;br /&gt;
    {&lt;br /&gt;
        #region IOrder Members&lt;br /&gt;
 &lt;br /&gt;
        public event EventHandler&amp;lt;ExternalDataEventArgs&amp;gt; NotPaid;&lt;br /&gt;
        public event EventHandler&amp;lt;ExternalDataEventArgs&amp;gt; InStock;&lt;br /&gt;
        public event EventHandler&amp;lt;ExternalDataEventArgs&amp;gt; PaymentMade;&lt;br /&gt;
        public event EventHandler&amp;lt;ExternalDataEventArgs&amp;gt; Dispatch;&lt;br /&gt;
        public event EventHandler&amp;lt;ExternalDataEventArgs&amp;gt; AddressNotProper;&lt;br /&gt;
 &lt;br /&gt;
        public event EventHandler&amp;lt;ExternalDataEventArgs&amp;gt; AddressCorrected;&lt;br /&gt;
 &lt;br /&gt;
        public event EventHandler&amp;lt;ExternalDataEventArgs&amp;gt; ProductStocked;&lt;br /&gt;
 &lt;br /&gt;
        #endregion&lt;br /&gt;
        public void CallNotPaid(ExternalDataEventArgs args)&lt;br /&gt;
        {&lt;br /&gt;
            // 触发工作流中相应的活动&lt;br /&gt;
            NotPaid(null, args);&lt;br /&gt;
            Console.WriteLine("This order is not paid");&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
其中 &lt;span style="color: blue; font-size: 9pt"&gt;event&lt;/span&gt;&lt;span style="font-size: 9pt"&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ExternalDataEventArgs&lt;/span&gt;&amp;gt;&lt;/span&gt; 代码相当于C# 1.0 中的语法：&lt;/div&gt;
&lt;div&gt;delegate void ExternalDataEventHandler(object sender, ExternalDataEventArgs e);&lt;/div&gt;
&lt;div&gt;event ExternalDataEventHandler OnInitStart;&lt;/div&gt;
&lt;div&gt;事件只有两个参数，一个是sender谁触发的，一个是相关的参数。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;event EventHandler &amp;lt;ExternalDataEventArgs&amp;gt;定义的是一个事件。 其中EventHandler &amp;lt;ExternalDataEventArgs&amp;gt;是一个delegate的简化定义。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 9pt"&gt;public&lt;/span&gt;&lt;span style="font-size: 9pt"&gt; &lt;span style="color: blue"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;ExternalDataEventArgs&lt;/span&gt;&amp;gt; NotPaid;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;这里定义了一个EventHandler 类型的事件 NotPaid。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="690" height="422" src="/userfiles/EntLib/image/WF/WF_StateMachine_simple_1.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;其中，&lt;span style="font-size: 9pt"&gt;NotPaid(&lt;span style="color: blue"&gt;null&lt;/span&gt;, args);&lt;/span&gt;方法触发工作流中相应的活动，这里是触发NotPaid事件，进一步转换State的状态。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/156.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/03/21/wf-again.aspx</guid>
            <pubDate>Sat, 21 Mar 2009 15:58:26 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/156.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/03/21/wf-again.aspx#feedback</comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/156.aspx</wfw:commentRss>
        </item>
        <item>
            <title>WF 工作流开发向导之一 – 向工作流中传递参数</title>
            <link>http://blog.entlib.com/EntLib/archive/2008/10/08/wf.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;WF &lt;/b&gt;&lt;b&gt;工作流开发向导之一 – &lt;/b&gt;&lt;b&gt;向工作流中传递参数&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本篇文章是按照WF实验手册范例 (Hands-on Labs from Microsoft) 进行学习总结的。示例程序分为2个项目，分别为工作流Workflow 项目和承载Workflow 的Windows Form项目。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;示例程序如下：&lt;/div&gt;
&lt;img height="248" alt="" width="510" src="/userfiles/EntLib/image/WF/WF_learning_part1_1.gif" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;1. &lt;/b&gt;&lt;b&gt;承载Workflow&lt;/b&gt;&lt;b&gt;的Windows Form &lt;/b&gt;&lt;b&gt;相关代码：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;怎么传递流程参数？启动流程实例时把参数装载到Dictionary中作为CreateWorkflow方法的参数传递：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;         private WorkflowRuntime wr;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;         private void btnStartWorkflow_Click(object sender, EventArgs e)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;         {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;            if (wr == null)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;                wr = new WorkflowRuntime();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;                wr.StartRuntime();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;              Dictionary&amp;lt;string, object&amp;gt; parameters = new Dictionary&amp;lt;string, object&amp;gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;              parameters.Add("FirstName", txtFirstName.Text);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;              parameters.Add("LastName", txtLastName.Text);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;            &lt;b&gt;WorkflowInstance instance = wr.CreateWorkflow(typeof(HelloWorldWorkflow.Workflow1), parameters);&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;            instance.Start();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;         }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;2. &lt;/b&gt;&lt;b&gt;工作流相关代码&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;获取参数是在流程文件中建立相同名称的属性，流程中就可以得到这些参数：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;    public partial class Workflow1 : SequentialWorkflowActivity&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        private void codeActivity1_ExecuteCode(object sender, EventArgs e)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;            MessageBox.Show("Hello world: " + firstName + " " + lastName);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        private string firstName;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        public string FirstName&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;            get { return firstName; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;            set { firstName = value; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        private string lastName;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        public string LastName &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;            get { return lastName; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;            set { lastName = value; } &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;工作流代码文件中定义了2个属性FirstName 和LastName，承载工作流的Windows Form 程序在启动流程实例时：首先定义一个Dictionary 的变量parameters，然后向parameters增加相同的名称的键(FirstName 和 LastName)和值添加到字典中，这样Workflow 可以自动获取这些值。&lt;/div&gt;
&lt;div align="left"&gt;Dictionary&amp;lt;&lt;span&gt;string, object&amp;gt; parameters = new Dictionary&amp;lt;string, object&amp;gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;parameters.Add(&lt;span&gt;"FirstName", txtFirstName.Text);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;parameters.Add(&lt;span&gt;"LastName", txtLastName.Text);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;div&gt;演示程序运行界面如下：&lt;/div&gt;
&lt;img height="310" alt="" width="576" src="/userfiles/EntLib/image/WF/WF_learning_part1_2.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;Reference:&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. WF C# 和 VB.NET 实验手册范例 (Hands-on Labs from Microsoft)&lt;/div&gt;
&lt;div&gt;&lt;a href="http://blog.entlib.com/EntLib/archive/2008/09/19/wf-c-vb.net-hands-on-labs-from-microsoft.aspx"&gt;&lt;font color="#800080"&gt;http://blog.entlib.com/EntLib/archive/2008/09/19/wf-c-vb.net-hands-on-labs-from-microsoft.aspx&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;br /&gt;
Tags 标签： &lt;a rel="tag" href="http://blog.entlib.com/EntLib/Tags/WF/Default.aspx"&gt;WF&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/32.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2008/10/08/wf.aspx</guid>
            <pubDate>Wed, 08 Oct 2008 14:41:45 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/32.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2008/10/08/wf.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/32.aspx</wfw:commentRss>
            <enclosure url="http://blog.entlib.com/userfiles/EntLib/file/HelloWorldWorkflow_EntLib.zip" length="71" type="application/octetstream" />
        </item>
        <item>
            <title>WF C# 和 VB.NET 实验手册范例 (Hands-on Labs from Microsoft)</title>
            <link>http://blog.entlib.com/EntLib/archive/2008/09/19/wf-c-vb.net-hands-on-labs-from-microsoft.aspx</link>
            <description>&lt;div align="center"&gt;&lt;strong&gt;WF C# &lt;/strong&gt;&lt;strong&gt;和 VB.NET &lt;/strong&gt;&lt;strong&gt;实验手册范例 (Hands-on Labs from Microsoft)&lt;/strong&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;img align="left" alt="" src="http://forum.entlib.com/useruploadfiles/jacky/image/WF/Workflow.gif" /&gt;WF (Windows Workflow Foundation) 是在windows平台上快速创建工作流应用程序的编程模型、引擎和工具。实验手册包括10个范例（C# 和VB.NET语言），这些范例适合于有6个月以上的.NET 开发经验，同时对WF有兴趣的开发人员。每一个范例实际操作大概需要60分钟。下载包有操作手册、范例需要的文件和完整的代码。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下载地址（英文）：&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=2E575633-E357-4EE7-AAFF-34138F00E830&amp;amp;displaylang=en"&gt;&lt;font color="#800080"&gt;http://www.microsoft.com/downloads/details.aspx?familyid=2E575633-E357-4EE7-AAFF-34138F00E830&amp;amp;displaylang=en&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下面还有2篇 WF 入门文章：&lt;/div&gt;
&lt;div&gt;&lt;a href="http://forum.entlib.com/Default.aspx?g=posts&amp;amp;t=227"&gt;&lt;font color="#800080"&gt;WF (Windows Workflow Foundation) &lt;span&gt;&lt;span&gt;入门向导&lt;/span&gt; – &lt;span&gt;范例程序下载&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;a href="http://forum.entlib.com/Default.aspx?g=posts&amp;amp;t=228"&gt;&lt;font color="#800080"&gt;WF (Windows Workflow Foundation) &lt;span&gt;&lt;span&gt;快速入门实践&lt;/span&gt; Part 2 – &lt;span&gt;范例程序下载&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;如果你第一次接触 WF，建议你先看看上面的WF 入门文章。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; Tags 标签： &lt;a rel="tag" href="http://blog.entlib.com/EntLib/Tags/WF/Default.aspx"&gt;WF&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/25.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2008/09/19/wf-c-vb.net-hands-on-labs-from-microsoft.aspx</guid>
            <pubDate>Fri, 19 Sep 2008 12:20:15 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/25.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2008/09/19/wf-c-vb.net-hands-on-labs-from-microsoft.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/25.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>