zoukankan      html  css  js  c++  java
  • WF学习笔试1-HelloWorld

            好久都没有接触和学习新技术,要抱怨说公司忙,实在为自己的懒惰找借口。工作的人慢慢的就与学生不太一样,有时抱着得过且过的心态!现在想想还是很怀念以前学生年代深夜敲击键盘的学习劲头!
    流程引擎不是第一次接触,在去年的时候与一个同事在外面接了一个万科的OA系统,当时对方指定要使用K2.NET流程引擎开发。并给我们提供了带服务器的虚拟机。那时是我第一次接触流程引擎,对工作流的概念也有了比较直观的认识!。
    上周六陪朋友去了书店看书,拿了二本.NET3.0方面的书。其中一本第32章讲到用WF制作订单状态管理工作流。翻开看了一下知道WF,了解到微软现在给VS2008中集成了这样一个框架,个人感觉,它的应用范围应该会越来越广。于是这二天下班回来后开始学习WF。

            闲话打住,切入正题。在开始还是先给不明白的朋友介绍一下WF(网上也有称为WWF,不过微软建议称为WF)
    WF全称是 Microsoft Windows Workflow Foundation ,它是一个可扩展框架,用于在 Windows 平台上开发工作流解决方案,VS2005下需要安装.NET3.0框架及Visual Studio 2005 Extensions for Windows Workflow Foundation.exe。VS2008中默认集成WF。

            我学东西也不大喜欢先搞概念,理论的东西,喜欢比较直观的,看的见的,HelloWorld基本是学每种程序的入门级示例。虽然老套,但我想还是很有用。今天的笔记就写写WF版本的HelloWorld。
            第1步:打开VS2008,新建立项目Workflow->顺序工作流控制台程序 WFHelloWorld

             建立后项目结构如下:


    1.其中Program.cs是宿主程序,也即是控制台程序可以理解为主程序!
    2.Workflow1.cs是可视化的workflow工作流设计器,你可以将工具箱里的活动控件拖到该设计器中,这里是你定义工作流的主要地方,该可视化的设计器有自动检测功能,没有通过检测会有叹号做相应提示。
        在这里有必要介绍一下WF中的Activity(活动)。
        WF主要的组成部件是活动(Activity),活动组成了工作流中的步骤(或任务),也可以说活动定义了工作流.我们按顺序和层次组织活动,然后这些活动将作为指令供工作流引擎执行.WF中所有的活动都继承一个基类-Activity,WF就运作在这些基本活动库中的现成活动之上.Windows Workflow允许开发人员扩展基本活动库的功能,通过创建自定义活动来解决特定领域的问题.
        我们可以自己定义Actitvity,微软也为我们提供了一些Actitvity

    了解这些后,我们接着做。

            第2步:我们往Workflow1.cs中拖入一个CodeActivity,注意图中有个感叹号,这里就是前面说的工作流设计器的检测功能,如下图:

    这是因为code活动,我们没有定义他的ExecuteCode(执行代码)

    在ExecuteCode中输入一个方法名,程序会自动生成一个事件方法。
    /************************************************
    //author:fengyan
    //blog:
    http://eflylab.cnblogs.com
    //date:2008-06-18 22:43
    /**********************************************
    */ 
    using System;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Collections;
    using System.Drawing;
    using System.Linq;
    using System.Workflow.ComponentModel.Compiler;
    using System.Workflow.ComponentModel.Serialization;
    using System.Workflow.ComponentModel;
    using System.Workflow.ComponentModel.Design;
    using System.Workflow.Runtime;
    using System.Workflow.Activities;
    using System.Workflow.Activities.Rules;

    namespace WFHelloWorld
    {
        
    public sealed partial class Workflow1: SequentialWorkflowActivity
        {
            
    public Workflow1()
            {
                InitializeComponent();
            }

            
    private void ExecuteHello(object sender, EventArgs e)
            {
                System.Console.WriteLine(
    "Hello world");
            }
        }

    }

    我们给方法输入一个代码,很简单的输出!
    这时我们返回去看Program.cs里面的代码体
    static void Main(string[] args)
            {
                
    using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
                {
                    AutoResetEvent waitHandle 
    = new AutoResetEvent(false);
                    workflowRuntime.WorkflowCompleted 
    += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
                    workflowRuntime.WorkflowTerminated 
    += delegate(object sender, WorkflowTerminatedEventArgs e)
                    {
                        Console.WriteLine(e.Exception.Message);
                        waitHandle.Set();
                    };

                    WorkflowInstance instance 
    = workflowRuntime.CreateWorkflow(typeof(WFHelloWorld.Workflow1));
                    instance.Start();

                    waitHandle.WaitOne();
                }
            }

    这是工具自动生成的先别着急它们的意思,我们在最后稍加修改,
    static void Main(string[] args)
            {
                
    //WorkflowRuntime:在工作流的运行环境(宿主)中,为工作流提供运行的引擎。
                using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
                {
                    AutoResetEvent waitHandle 
    = new AutoResetEvent(false);
                    
    //以下二个事件是引擎中的某个实例完成后和终止后的事件
                    workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
                    workflowRuntime.WorkflowTerminated 
    += delegate(object sender, WorkflowTerminatedEventArgs e)
                    {
                        Console.WriteLine(e.Exception.Message);
                        waitHandle.Set();
                    };

                    
    //WorkflowInstance:是指在工作流引擎中运行的工作流实例。
                    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WFHelloWorld.Workflow1));
                    instance.Start();

                    waitHandle.WaitOne();

                    
    //等待用户响应退出
                    Console.WriteLine("Press any key to exit");
                    Console.ReadLine();
                }
            }

    在最后加上二行,为方便观看效果!现在可以运行,F5

    输入HelloWorld。
    这可能是最简单的WFHelloWord了,稍微加修改一下,增加一个简单的互动功能。
    我们在Workflow1中添加一个属性UserName
    private string username = "";
            
    public string UserName
            {
                
    get { return username; }
                
    set { username = value; }

            }
            
    public Workflow1()
            {
                InitializeComponent();
            }

            
    private void ExecuteHello(object sender, EventArgs e)
            {
                System.Console.WriteLine(
    "{0},Hello world",username);
            }
    修改Program.cs中
     static void Main(string[] args)
            {
                
    //WorkflowRuntime:在工作流的运行环境(宿主)中,为工作流提供运行的引擎。
                using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
                {
                    AutoResetEvent waitHandle 
    = new AutoResetEvent(false);
                    
    //以下二个事件是引擎中的某个实例完成后和终止后的事件
                    workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {waitHandle.Set();};
                    workflowRuntime.WorkflowTerminated 
    += delegate(object sender, WorkflowTerminatedEventArgs e)
                    {
                        Console.WriteLine(e.Exception.Message);
                        waitHandle.Set();
                    };
                    
                   
                    Console.WriteLine(
    "Press enter your userName");
                    Dictionary
    <stringobject> dictionary = new Dictionary<stringobject>();
                    
    //接收用户输入
                    string userName = Console.ReadLine();
                    
    //注意下面的UserName必须与Workflow1中的属性名完全一致才行
                    dictionary.Add("UserName", userName);
                    
    //WorkflowInstance:是指在工作流引擎中运行的工作流实例。
                    
    //利用重载创建
                    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WFHelloWorld.Workflow1), dictionary);
                    instance.Start();

                    waitHandle.WaitOne();

                    
    //等待用户响应退出
                    Console.WriteLine("Press any key to exit");
                    Console.ReadLine();
                }
            }
    运行效果


    DownLaod Demo

  • 相关阅读:
    JS实现类似网页的测试考卷
    Following Orders(poj1270)
    1007
    Intervals(poj1201)
    LightOJ
    1002
    King's Order(hdu5642)
    Beautiful Walls
    A. Watchmen(Codeforces 650A)
    Shortest Path(hdu5636)
  • 原文地址:https://www.cnblogs.com/eflylab/p/1225021.html
Copyright © 2011-2022 走看看