zoukankan      html  css  js  c++  java
  • WWF之简单的状态机工作流例子

    原来做的OA项目中用的公务审批这样的工作流。我们自己写的程序来实现。现在微软有了WWF工作流。研究了一下果然很好。里面也有好多好的机制。
    WWF工作流有两种:顺序工作流和状态机工作流
    一般OA系统或者其他系统的审批流程都是对应微软工作流的状态机工作流,状态机工作需要事件驱动而且一般都有外界用户交互的界面。
    这个例子就是简单状态机工作流例子,学会以后自己添加业务处理方法进去来实现自己的审批业务流程
    开发工具:vs2005.和wf扩展工具For vs2005。(直接使用vs2008也ok)
    建立了两个项目:
    1。window应用程序,来工作流和外界用户的交互
    2.状态机工作流类库。
    查看更多精彩图片
    先完成状态机工作流类库

    1.添加接口文件。在接口文件里面完成工作流将要调用的事件。

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Workflow;
    using System.Workflow.Runtime;
    using System.Workflow.Activities;
    namespace Workflow
    {
        [System.Workflow.Activities.ExternalDataExchange]
        public interface IEventProcess//接口类。定义了两个方法。开始和处理方法
     {
            event EventHandler<EventProcessArgs> StartEvent;
            event EventHandler<EventProcessArgs> ProcessEvent;
     }

        [Serializable]//事件传递的参数。是个类继承ExternalDataEventArgs,并且要序列化

        public class EventProcessArgs : System.Workflow.Activities.ExternalDataEventArgs
        {
            public EventProcessArgs(Guid guid)
                : base(guid)
            {
     
            }

            private string message;

            public string Message
            {
                get { return message; }
                set { message = value; }
            }
        }

        public class EventProcess : IEventProcess//实现类继承接口。里面有两个方法调用事件。在window程序中就是调用这个两个方法来触发状态机工作流中的事件驱动
        {
            public void RaiseStart(string  gid,string message )
            {
                Guid guid = new Guid(gid);
                EventProcessArgs args = new EventProcessArgs(guid);
                args.Message = message;
                StartEvent(null, args);
            }

            public void RaiseProcess(string gid,string message)
            {
                Guid guid = new Guid(gid);
                EventProcessArgs args = new EventProcessArgs(guid);
                args.Message = message;
                ProcessEvent(null, args);
            }

            #region IEventProcess 成员

            public event EventHandler<EventProcessArgs> StartEvent;

            public event EventHandler<EventProcessArgs> ProcessEvent;

            #endregion
        }

    }
    2添加状态机工作流文件。

    从工具箱拉三个StateActiviey。前两个里面再拖入EventActivity。实例图如下:

    第一个EventDrivenAtiviey双击。然后拖入一个handleExternalEventActivity1。配置他的属性:就是接口类型和事件名称。

    查看更多精彩图片

    然后拖拉一个setStateActiviey设置他的目标状态指向第二个state

    重复上步操作设置第二个enentActivity。最后图示:

    查看更多精彩图片

    然后编译这个类库文件。

    二。打开window应用程序。添加这个类库文件的引用。然后再添加在net栏目下面添加三个工作流相关的dll。

    放四个按钮控件:创建工作流引擎,创建工作流实例,触发开始事件,触发处理事件

    整个类文件如下。主要是4个按钮事件

    namespace WindowsApplication5ForState
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            System.Workflow.Runtime.WorkflowRuntime runtime = null;
            //System.Threading.AutoResetEvent autoEvent = new AutoResetEvent(false);
            Workflow.EventProcess process = null;
            System.Workflow.Runtime.WorkflowInstance instance = null;

            private void button1_Click(object sender, EventArgs e)
            {
                 runtime = new WorkflowRuntime();
                runtime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(runtime_WorkflowCompleted);
                runtime.WorkflowCreated += new EventHandler<WorkflowEventArgs>(runtime_WorkflowCreated);
                runtime.WorkflowIdled += new EventHandler<WorkflowEventArgs>(runtime_WorkflowIdled);
                runtime.WorkflowTerminated += new EventHandler<WorkflowTerminatedEventArgs>(runtime_WorkflowTerminated);
                ExternalDataExchangeService changeService = new ExternalDataExchangeService();
                runtime.AddService(changeService);
                process = new Workflow.EventProcess();
                changeService.AddService(process);
                runtime.StartRuntime();
                //autoEvent.WaitOne();
                MessageBox.Show("工作流已经完成");
            }

            void runtime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
            {
                MessageBox.Show("工作流引擎被结束");
            }

            void runtime_WorkflowIdled(object sender, WorkflowEventArgs e)
            {
                MessageBox.Show("工作流引擎现在处于空闲状态");
            }

            void runtime_WorkflowCreated(object sender, WorkflowEventArgs e)
            {
                MessageBox.Show("工作流引擎已经创建");
            }

            void runtime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
            {
                MessageBox.Show("工作流引擎完成");
                //autoEvent.Set();
            }

            private void button2_Click(object sender, EventArgs e)
            {
                instance = runtime.CreateWorkflow(typeof(Workflow.Workflow1));
               
                instance.Start();
            }

            private void button3_Click(object sender, EventArgs e)
            {
                process.RaiseStart(instance.InstanceId.ToString(), "Start event !!");
            }

            private void button4_Click(object sender, EventArgs e)
            {
                process.RaiseProcess(instance.InstanceId.ToString(), "Process event !!");
            }

        }
    }

    这样就ok了。首先实例化工作流引擎。然后创建一个工作流实例,然后就开始运行工作指定的流程。先是引发开始事件。然后,引发处理事件。整个工作流就完成了



     

    本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

  • 相关阅读:
    树梅派学习之——nano编辑器
    树梅派学习之——输入法安装
    Qt的正则表达式类(QRegExp)
    虚拟机VMware上网配置
    Qt Android环境搭建
    qt5.8.0之静态编译
    qt编译之CONFIG += console
    面向对象的3个特性:封装、继承、多态
    Python笔记:df.loc[]和df.iloc[]的区别
    Python报错ValueError: arrays must all be same length
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319468.html
Copyright © 2011-2022 走看看