`
wangyihust
  • 浏览: 437201 次
文章分类
社区版块
存档分类
最新评论

WWF消息传送机制初步探讨

阅读更多
     
1. host程序向workflow传送信息
      1) 使用事件机制
      host程序以winForm为例,WWF由状态机流程的handleExternalEventActivity为例,该Activity需要等待一个事件的触发才能够继续工作流的运行,而该事件的触发则由host程序上的BUTTON点击事件触发。
 
所有host与Workflow的通讯均要通一个实现了某个interface的class来进行,下面是interface的定义
[System.Workflow.Activities.ExternalDataExchange]//该接口必须标记有此属性
    public interface IUserInterface
    {
        void SendMessage(IntPtr handle,DataFromWin args);//host将通过调用此方法来触发事件
        event EventHandler<DataFromWin> SendNum;//该EventHandle负责向Workflow传送事件及数据,触发handleExternalEventActivity的执行,从而开始workflow。
    }
 
比较恶心的是,MS规定向workflow传送的数据必须继承于某个特殊的class格式如handleExternal必须继承自ExternalDataEventArgs
[Serializable]//实现之前必须有此属性,该类负责传输实例化后的workflow的instanceId,以及部分host需要向workflow传送的数据,例如str就是从host端传入的
    public class DataFromWin : ExternalDataEventArgs
    {
        private Guid documentId;
        private string str;
        public DataFromWin(Guid instanceId,string str)
            : base(instanceId)
        {
            this.documentId = instanceId;
            this.str = str;
        }
        public Guid DocumentId
        {
            get { return this.documentId; }
            set { this.documentId = value; }
        }
        public string stre
        {
            get { return this.str; }
            set { this.str = value; }
        }
    }
下面的类负责实现上文提到的interface:
public class UserInterface : IUserInterface
    {
        public void SendMessage(IntPtr handle, DataFromWin args)
        {//实际上IntPtr handle 也可以放在args中传送
            Console.WriteLine("hello");
            if (this.SendNum != null)
                this.SendNum(handle,args);//该句负责向workflow传送事件及host的数据,一旦执行该命令,则handleExternalEventActivity将开始工作
        }
        public event EventHandler<DataFromWin> SendNum;
    }
 
下面转到vs的workflow设计界面,选中handleExternalEventActivity,在properties中有如下几个选项:
EventName:SendNum//选择触发该activity执行的事件,该事件是在interface中定义的
InterfaceType:Iuserinterface//选择该activity需要执行的interface
Invoked:Runit//在该activity执行过程中,需要执行的方法,注意该方法在workflow类中定义,并且签名要满足该activity的定义,如:
public void Runit(Object sender, ExternalDataEventArgs e)
        {
            Console.WriteLine(((DataFromWin)e).stre);
           newText((IntPtr)sender);          
        }
 
下面在host中编写代码触发该activity的执行
private WorkflowLibrary1.UserInterface xx= new WorkflowLibrary1.UserInterface();
首先实例化这个负责host和workflow间数据传送的类,再次声明,此类的运行机制很重要,基本代表了wwf中各种activity的触发和数据传送机制。
workflowRuntime = new WorkflowRuntime();
ExternalDataExchangeService mmm = new ExternalDataExchangeService();
workflowRuntime.AddService(mmm);
mmm.AddService(xx);
workflowRuntime.StartRuntime();
中间3句比较有意思,wwf中,activity与外界的交流貌似都要通过各种service来实现,有得可以直接添加相应的接口实现类就可以了,有的必须要首先添加规定的service,比如这个例子,首先要向runtime中添加ExternalDataExchangeService的实例,再向ExternalDataExchangeService中添加负责数据交换的UserInterface类。有的情况下直接添加UserInterface类就ok了,搞不懂,就当这是规定吧,谁叫俺不是设计这个咚咚的人呢。
 
然后实例化workflow,触发workflow开始工作的代码如下
private void button1_Click(object sender, EventArgs e)
        {
xx.SendMessage(this.Handle,new WorkflowLibrary1.DataFromWin(workflowInstance.InstanceId,this.textBox1.Text));
        }
host调用UserInterface实例的方法,传入Handle和符合ExternalDataEventArgs的类,其中主要有2个信息,一是该workflow的实例号,二是winform界面输入的字符。感觉之所以强制数据交换类符合ExternalDataEventArgs的要求,就是为了获得workflow的实例号,防止多个workflow实例运行时消息的误传递。
紧接着this.SendNum(handle,args);将数据传入workflow,同时该事件的触发导致handleExternalEventActivity的执行从而开启整个workflow,获得启动后handleExternalEventActivity同时还将执行回调函数Runit处理传送进的数据。至此,整个从host向workflow传递数据的过程结束了。
 
2) 使用属性
Workflow:
   public partial class Workflow1 : SequentialWorkflowActivity
    {
        private void codeActivity1_CodeHandler(object sender, EventArgs e)
        {
            System.Windows.Forms.MessageBox.Show(
                "Hello, World!: " + firstName + " " + lastName);
        }
        private string firstName;
        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }
        private string lastName;
        public string LastName
        {
            get { return lastName; }
            set { lastName = value; }
        }
Host宿主程序:
   if (wr == null)
            {
                wr = new WorkflowRuntime();
                wr.StartRuntime();
            }
   Dictionary<string, object> parameters = new Dictionary<string, object>();
   parameters.Add("FirstName", txtFirstName.Text);
   parameters.Add("LastName", txtLastName.Text);
 WorkflowInstance instance = wr.CreateWorkflow(typeof(HelloWorldWorkflow.Workflow1), parameters);
    instance.Start();
 
2. 从workflow向host传送数据的流程如下:
      首先我的目的是在workflow运行到某一阶段的时候触发一个事件,在winform的textbox2上显示一条文本。这需要向workflow传送一个该form的handle,有2种方式传送该handle:
     一是将此handle 封装在符合ExternalDataEventArgs要求的类中,也就是DataFormWin类,这比较简单也比较直观,就不说了
     二是在workflow中定义一个IntPtr类型的属性,在初始化workflow的时候传入
        public static DependencyProperty HandleProperty = System.Workflow.ComponentModel.DependencyProperty.Register("Handle", typeof(IntPtr), typeof(Workflow1));
        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public IntPtr Handle
        {
            get
            {
                return ((IntPtr)(base.GetValue(Workflow1.HandleProperty)));
            }
            set
            {
                base.SetValue(Workflow1.HandleProperty, value);
            }
        }//workflow中的属性代码,so麻烦,懒得看,照着用就是了
在初始化的时候
Dictionary<string, object> parameters = new Dictionary<string, object>();
parameters.Add("Handle", this.Handle);//建立参数,将handle 传入workflow
workflowInstance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1),parameters);//初始化
workflowInstance.Start();
之后在vs的workflow设计界面handleExternalEventActivity的sender属性上选择Handle就ok了。
数据传入后,以下的处理都差不多
首先,定义delegate:public delegate void textBoxuseEventHandler(IntPtr Handle);
其次,在workflow类中初始化:public static textBoxuseEventHandler newText;
再次,在Runit中触发newText(((DataFromWin)e).Handle);
在host端订阅WorkflowLibrary1.Workflow1.newText = TextShow;
 public void TextShow(IntPtr handle)
        {
            Form1 form = (Form1)(Form1.FromHandle(handle));
            if (form != null) form.MessageReceive("12133dsfdsf");
        }
       public void MessageReceive( string message)
        {
            if (this.InvokeRequired)
            {
                MessageDisplayDelegate messageDisplay = new MessageDisplayDelegate(this.MessageReceive);
                this.Invoke(messageDisplay, message);
            }
            else
            {
                this.textBox2.Text += message;
            }
        }
特别注意黑体的代码,如果没有这行,则会出现cross-thread访问异常。
 
 
分享到:
评论

相关推荐

    工作流WWF例子

    WWF提供了强大的设计工具、运行时环境和持久化机制,使得开发者能够更轻松地创建复杂的工作流解决方案。 在这个"工作流WWF例子"中,我们可能会遇到以下几个关键知识点: 1. **WWF架构**:WWF包含三个主要部分:...

    WWF开发指南 源码 光盘

    标题和描述中提到的“WWF开发指南 源码 光盘”是指一个关于World Wide Fund for Nature(世界自然基金会,通常简称为WWF)相关项目开发的指导资源,其中包含了源代码和光盘内容。这里的“WWF”可能有两种含义:一是...

    asp.net wwf简单实例

    在描述中提到的"主程序和workflow之间互相传值",可能涉及到这些机制。 7. **代码示例**:实例中的`FuckWF`可能是一个工作流项目,包含了流程定义和与ASP.NET交互的代码。开发者可能会使用XAML(XML标记语言)来...

    WWF工作流完整例子.rar

    10. **错误处理和补偿**:WWF提供了错误处理机制,允许在工作流中捕获和处理异常,并通过补偿活动来撤销之前的操作,确保业务一致性。 综上所述,"WWF工作流完整例子.rar"文件是一个学习和实践WWF工作流的宝贵资源...

    WWF入门最简单的实例

    ** WWF 入门教程详解 ** World Wide Fund for Nature(世界自然基金会)通常与环保组织相关联,但在IT领域,WWF代表Windows Workflow Foundation,这是Microsoft .NET Framework中的一个组件,用于构建业务流程和...

    WWF制作订单管理模块实例

    在这个订单管理模块实例中,我们将深入探讨如何利用WWF来创建高效且灵活的订单处理流程。 ### 1. WWF基础概念 Windows Workflow Foundation 是一种编程模型,它允许开发人员以声明式的方式定义业务流程,这些流程...

    WWF中组合Activity

    工作流基础与Windows Workflow Foundation (WWF) Windows Workflow Foundation (WWF) 是.NET Framework中用于构建业务流程和工作流应用程序的框架。它提供了一种结构化的方法来设计、执行和管理业务逻辑,允许开发...

    Asp.net工作流(WWF+LINQ)

    Asp.NET工作流(Windows Workflow Foundation, WWF)与LINQ(Language Integrated Query)是Microsoft .NET Framework中的两个重要技术,它们在构建复杂的业务流程和数据处理应用中发挥着关键作用。 **Asp.NET工作...

    WWF的高级开发WWF的高级开发

    WWF的高级开发涉及到许多复杂的技术和概念,这些在《WID_SD303_ Windows Workflow Foundation的高级开发_刘磊.pps》这个文件中可能会详细探讨。下面将深入解析WWF的高级开发知识点。 首先,理解WWF的基础架构是至关...

    WWF中的“HelloWorld”

    WWF中的“HelloWorld”1

    WPF+WCF+WWF+LINQ完美结合

    WPF是微软推出的一种全新的用户界面框架,它提供了丰富的图形渲染机制、数据绑定、样式和模板、以及多媒体支持。在本示例中,WPF被用来创建美观、交互性强的用户界面,利用XAML语言定义界面布局和元素,使得UI设计...

    WWF实战 代码与pdf档

    【标题】:“WWF实战 代码与pdf档”这一主题主要涵盖了两个方面:World Wildlife Fund(世界自然基金会)的工作实践以及相关的编程代码和PDF文档。这可能是关于利用技术手段保护生态环境,尤其是野生动物的一个项目...

    WWF工作流设计

    简单的WWF工作流设计的基本内容

    WWF的杂志.rar

    5. **ASP.NET集成**:探讨如何在ASP.NET Web应用程序中嵌入和利用WWF,以实现动态流程控制。 6. **工作流持久化**:讨论工作流在暂停、恢复和重新启动时的持久化策略,以及数据存储的要求。 7. **自定义活动**:说明...

    WWF.zip_wwf_wwf 工作流_工作流节点_流程_自定义 流程

    本文将深入探讨微软的Windows Workflow Foundation (WWF),它是一种用于构建工作流应用程序的强大框架。WWF允许开发人员创建复杂的业务流程,这些流程可以描述一系列有顺序的步骤,每个步骤都代表业务中的一个活动。...

    WWF开发指南

    WWF开发指南,原版书扫描件,不含示例源码,源码网上有,自己去下载

    WWF 工作流学习笔记

    【Windows Workflow Foundation (WWF)】 Windows Workflow Foundation (WWF) 是 Microsoft .NET Framework 的一部分,用于构建工作流驱动的应用程序。WWF 提供了一种编程模型,使得开发者能够创建、执行和管理复杂的...

    WWF的杂志-生成工作流

    《WWF的杂志-生成工作流》第七期深入探讨了工作流的各种方面,从理论到实践,为读者提供了宝贵的知识和见解。 #### 二、构建工作流平台 - **标题**: 在工作流平台上构建应用程序 - **作者**: David Green - **主要...

    WWF.rar_callexternalmeth_wwf

    标题中的"WWF.rar_callexternalmeth_wwf"可能指的是一个关于World Wildlife Fund(世界自然基金会,简称WWF)的项目,其中涉及到“调用外部方法”(callexternalmeth)的技术主题。这个压缩包可能包含了多个示例,...

Global site tag (gtag.js) - Google Analytics