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

posted on 2008-06-18 23:08  冯岩  阅读(987)  评论(0编辑  收藏  举报

导航