惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

博客园 - windwolf

NHibernate的Decimal数据精度问题,急啊 最近M$发布了好多东东(我感兴趣的...) 对C#的一点抱怨 也谈WCF序列化(续) 也谈WCF的序列化 开辟《WF本质论》专栏,以供同好探讨 petshop笔记 map,area标签 - windwolf - 博客园 Windows Workflow Foundation之旅(八)——使用活动控制流程、在工作流中使用条件 家里被洗劫。。。 Windows Workflow Foundation之旅(七)——顺序工作流、状态机工作流 Aspect#是怎么工作的? OO设计原则 Windows Workflow Foundation之旅(六)——框架组成、工作流创作模式 Windows Workflow Foundation之旅(五)——指南3(创建自定义活动) 微软中国最近的两个webcasts Windows workflow foundation之旅(三)——指南2(创建状态机工作流)(上) Windows Workflow Foundation之旅(二)——指南1(创建顺序工作流) Windows Workflow Foundation之旅(一)——概况
Windows workflow foundation之旅(四)——指南2(创建状态机工作流)(下)
windwolf · 2005-12-19 · via 博客园 - windwolf

Windows workflow foundation之旅(四)——指南2(创建状态机工作流)(下)

翻译自:ms-help://MS.WinWF.v1.EN/WinWF_GettingStarted/html/8b6344bc-c879-41c5-babf-74e91c34d281.htm

构造OrderProcessing状态

我们这个工作流的下一个状态就是OrderProcessingState。在这个状态中,工作流已经收到了订单,并准备好处理了。这个状态和上一个状态最大的不同就是激活方式。WaitForOrderState状态是宿主程序触发一个事件激活的,这个事件通知工作流一个新的订单需要被处理。而在OrderProcessingState状态是上一个状态由SetState转移而激活的。

这个例子中,我们只是简单的给宿主程序发送一个消息,告诉它定单已经处理完了。但实际情况会复杂的多。在宿主程序更新完订单状态之后,我们使用SetState活动,把状态转移到这个工作流的最后一个状态。

在上一个状态中,状态直到收到了一个宿主事件后才开始执行,在这之前,状态机是空闲的。而这个状态则是立即开始执行的。立即执行的状态需要使用StateInitialization活动。这个活动是一种组件活动(类似EventDriven),但它是当状态一激活就立即执行的。

开始构建OrderProcessingState

1.  定义5个私有变量

类型

名称

InvokeMethodActivity

invokeProcessingNewOrderStatusUpdate

InvokeMethodActivity

invokeOrderProcessedStatusUpdate

SetState

setStateOrderCompleted

StateInitialization

initializeOrderProcessingState

State

OrderProcessingState

2.  用默认构造函数实例化。

以下的代码演示了如何构造一个OrderProcessingState。两个InvokeMethodActivity分别更新宿主程序的状态,SetState活动把控制权转移到最后一个状态。

//

// OrderProcessing State

//

this.invokeProcessingNewOrderStatusUpdate = new System.Workflow.Activities.InvokeMethodActivity();

this.invokeProcessingNewOrderStatusUpdate.ID = "invokeProcessingNewOrderStatusUpdate";

this.invokeProcessingNewOrderStatusUpdate.InterfaceType = typeof(Microsoft.Samples.Workflow.Quickstarts.StateMachine.IOrderingService);

this.invokeProcessingNewOrderStatusUpdate.MethodName = "ItemStatusUpdate";

this.invokeProcessingNewOrderStatusUpdate.ParameterBindings.Add(orderIdParameterBinding);

this.invokeProcessingNewOrderStatusUpdate.ParameterBindings.Add(itemStatusParameterBinding);

this.invokeProcessingNewOrderStatusUpdate.MethodInvoking +=

    new System.EventHandler(this.ProcessNewOrder);

this.invokeOrderProcessedStatusUpdate = new System.Workflow.Activities.InvokeMethodActivity();

this.invokeOrderProcessedStatusUpdate.ID = "invokeOrderProcessedStatusUpdate";

this.invokeOrderProcessedStatusUpdate.InterfaceType = typeof(Microsoft.Samples.Workflow.Quickstarts.StateMachine.IOrderingService);

this.invokeOrderProcessedStatusUpdate.MethodName = "ItemStatusUpdate";

this.invokeOrderProcessedStatusUpdate.ParameterBindings.Add(orderIdParameterBinding);

this.invokeOrderProcessedStatusUpdate.ParameterBindings.Add(itemStatusParameterBinding);

this.invokeOrderProcessedStatusUpdate.MethodInvoking += new EventHandler(FinalizeOrder);

this.setStateOrderCompleted = new System.Workflow.Activities.SetState();

this.setStateOrderCompleted.ID = "setStateOrderCompleted";

this.setStateOrderCompleted.TargetState = "OrderCompletedState";

this.initializeOrderProcessingState = new System.Workflow.Activities.StateInitialization();

this.initializeOrderProcessingState.Activities.Add(this.invokeProcessingNewOrderStatusUpdate);

this.initializeOrderProcessingState.Activities.Add(this.invokeOrderProcessedStatusUpdate);

this.initializeOrderProcessingState.Activities.Add(this.setStateOrderCompleted);

this.initializeOrderProcessingState.ID = "initializeOrderOpenState";

this.OrderProcessingState = new System.Workflow.Activities.State();

this.OrderProcessingState.ID = "OrderProcessingState";

this.OrderProcessingState.Activities.Add(this.initializeOrderProcessingState);

正如你在上一个状态中所做的,我们还要为InvokeMethodActivity中的MethodInvoking事件指定两个事件处理函数。

private void ProcessNewOrder(object sender, EventArgs e)

{

    itemStatus = "Processing order";

}

private void FinalizeOrder(object sender, EventArgs e)

{

    itemStatus = "Order processed";

}

构造OrderCompleted状态

一个状态机工作流有两个必需的状态,一个初始状态,一个终止状态。我们要创建的最后一个状态就是终止状态OrderCompletedState终止状态是工作流的最后一个状态,它不能包含任何子活动。

开始构造OrderCompletedState

1.  定义1个变量

类型

名称

State

OrderCompletedState

以下代码演示了如何创建最后一个状态。

//

// OrderCompleted State

//

this.OrderCompletedState = new System.Workflow.Activities.State();

this.OrderCompletedState.ID = "OrderCompletedState";

完成工作流类

到这里,状态机已经全部构建好了。最后一步就是把状态加到工作流中,并设好开始和终结状态。调用工作流类的Activities集合Add方法,把状态加到工作流中。加入的顺序无关紧要。在顺序工作流中,活动加入的顺序也并非是它执行的顺序;状态机工作流是通过事件触发和状态转移来驱动的,活动加入的顺序就更没关系了。

以下的代码演示了如何把状态加入工作流中,并将初始状态和结束状态属性分别设为各自的ID

// Construct the workflow

this.DynamicUpdateCondition = null;

this.ID = "Workflow1";

this.Activities.Add(this.WaitingForOrderState);

this.Activities.Add(this.OrderProcessingState);

this.Activities.Add(this.OrderCompletedState);

this.InitialState = "WaitingForOrderState";

this.CompletedState = "OrderCompletedState";

创建宿主程序

示例中的宿主程序是一个WinForm程序。宿主程序中有一个可以选择订单项的列表框,一个填写项目数量的文本框。当用户点击提交按钮后,订单将被提交到工作流。工作流在处理订单的过程中会调用ItemStatusUpdate接口方法,来更新订单的状态。你应该还记得这个方法是IOrderingService接口的一个方法。这个接口将在HostOrderService类中实现。这个类会用WorkflowRuntimeAddService方法,加入到WWF引擎中。

(译者:为了能清晰的看到程序的脉络,我只列出关键的代码)

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Workflow.Runtime;

using System.Workflow.Runtime.Hosting;

using System.Collections;

namespace Microsoft.Samples.Workflow.Quickstarts.StateMachineHost

{

    public partial class MainForm : Form

    {

        private HostOrderService myHost;

        private WorkflowRuntime workflowRuntime = null;

        ……

        public MainForm()

        {

            InitializeComponent();

            ......

            myHost = new HostOrderService();

            myHost.StatusUpdate += new HostOrderService.StatusUpdateDelegate(myHost_StatusUpdate);

            workflowRuntime = new WorkflowRuntime();

            workflowRuntime.AddService(myHost);

            workflowRuntime.StartRuntime();

        }

        private void myHost_StatusUpdate(object sender, ItemStatusUpdateEventArgs e)

        {

            ……

            if (cbOrderId.Items.Contains(e.OrderId) == false)

            {

               cbOrderId.Items.Add(e.OrderId);

            }

        }

        private void btnSubmit_Click(object sender, EventArgs e)

        {

            string item = cbItems.SelectedItem.ToString();

            int quantity = (int) udQuantity.Value;

            myHost.SubmitNewOrder(workflowRuntime, item, quantity);

        }

    }

    public class ItemStatusUpdateEventArgs : EventArgs

    {

        private string _status;

        private string _orderId;

        public ItemStatusUpdateEventArgs(string orderId, string status)

        {

            _status = status;

            _orderId = orderId;

        }

        public string OrderId

        {

            get { return _orderId; }

        }

        public string Status

        {

            get { return _status; }

        }

    }

    public class HostOrderService : StateMachineWorkflowQuickstart.IOrderingService

    {   

        public delegate void StatusUpdateDelegate( object sender, ItemStatusUpdateEventArgs e );

        public event StatusUpdateDelegate StatusUpdate;

        private WorkflowInstance curWorkflowInstance = null;

        private string _item;

        private int _quantity;

        public void SubmitNewOrder(WorkflowRuntime runtime, string item, int quantity)

        {

            _item = item;

            _quantity = quantity;

            // submit order to workflow and receive order id

            Type type = typeof(StateMachineWorkflowQuickstart.OrderProcessingWorkflow);

            curWorkflowInstance = runtime.StartWorkflow(type);

            // submit the order to the workflow

            NewOrder(null, new StateMachineWorkflowQuickstart.NewOrderEventArgs(curWorkflowInstance.InstanceId, item, quantity));

        }

        public void ItemStatusUpdate(string orderId, string newStatus)

        {

            StatusUpdate( this, new ItemStatusUpdateEventArgs( orderId, newStatus ));

        }

        public event EventHandler<StateMachineWorkflowQuickstart.NewOrderEventArgs> NewOrder;

        public void RetrieveOrderDetails(out string item, out int quantity)

        {

            item = _item;

            quantity = _quantity;

        }

    }

}

 Windows workflow foundation之旅(三)——指南2(创建状态机工作流)(上)
Windows Workflow Foundation之旅(五)——指南3(创建自定义活动)