Windows workflow foundation(三)——(创建状态机工作流)(下)(转载)

简介:

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

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

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

开始构建OrderProcessingState

1. 定义5个私有变量

类型

名称

InvokeMethodActivity

invokeProcessingNewOrderStatusUpdate

InvokeMethodActivity

invokeOrderProcessedStatusUpdate

SetState

setStateOrderCompleted

StateInitialization

initializeOrderProcessingState

State

OrderProcessingState

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

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

//

// OrderProcessingState

//

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

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

//

// OrderCompletedState

//

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;

}

}

}




本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2005/12/31/309164.html,如需转载请自行联系原作者

相关文章
|
消息中间件 Kafka Windows
Kafka Windows运行错误:创建消费者报错 consumer zookeeper is not a recognized option
Kafka Windows运行错误:创建消费者报错 consumer zookeeper is not a recognized option
689 0
Kafka Windows运行错误:创建消费者报错 consumer zookeeper is not a recognized option
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
298 1
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
671 0
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
1024 0
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
251 0
|
存储 安全 搜索推荐
微软发布 Windows 365:将 PC 置于云端,几分钟就能创建
微软发布 Windows 365:将 PC 置于云端,几分钟就能创建
261 0
微软发布 Windows 365:将 PC 置于云端,几分钟就能创建
|
PHP Windows
php windows多进程,php windows创建多进程,
php windows多进程,php windows创建多进程,
742 0
|
Shell 开发工具 git
如何在Windows上使用Git创建一个可执行脚本?
长话短说,今天介绍如何在windows上使用Git上创建一个可执行的shell脚本。
如何在Windows上使用Git创建一个可执行脚本?
|
开发工具 Python Windows
【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )(三)
【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )(三)
208 0
【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )(三)
|
Python Windows
【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )(二)
【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )(二)
199 0
【开发环境】Windows 安装 PyCharm 开发环境 ( 下载 PyCharm | 安装 PyCharm | 在 PyCharm 中创建 Python 工程 )(二)