和我一起学Windows Workflow Foundation(微软工作流)

本文档详述了学习Windows Workflow Foundation(WWF)的起步过程,包括如何创建和调试工作流实例,设置参数传递数据,利用Visual Studio 2005设计和调试工作流,以及如何使用HandleExternalEvent和CallExternalMethod活动。文章通过实例展示了工作流的创建、调试、参数传递和事件处理,适合初学者了解和掌握WWF的基础操作。
摘要由CSDN通过智能技术生成

(1)-----创建和调试一个WF实例

今天开始,我打算开始学习WWF,从网上搜索到了部分相关资料,也找到了一些文档和实验。但是,资料以英文的占多数,所以,在学习起来似乎比较吃力,不过相信我能坚持下来,顺便提高点英语阅读能力,不过本人英文水平实在是差,解释的不到位或错误的地方请大家谅解(千万别笑话我,哈哈)。毕竟我也是从空白开始学习WWF,让我们一起进步。

首先,我们需要安装WinFX下载)和Visual Studio 2005 extensions for .NET Framework 3.0 (Windows Workflow Foundation)。这是我们必备的开发组件。

这些例子和教程是从微软的labs上下载到的,分为10个部分。先来学最基础的第一部分先 :)

第一部分的目的

这个试验的目的是介绍Windows Workflow Foundation的工作流概念的关键点

完成了这个试验以后,我们可以学习到:

· 使用Visual Studio 2005 为WWF设计顺序工作流

· 配置和使用Visual Studio 2005调试器调试你的工作流

· 让工作流接受参数

· 通过接收事件触发一个新的工作流实例

· 定义条件

· 为If/Else, Delay, Listen, and Code配置基本的活动(activities不知道怎么翻译好)

· 给工作流为接收到的事件定制活动

工作流是在一个活动图中进行定义的,它可能是一个人为操作或一个系统进程。一个活动在工作流中是一个步骤,其体现为一个可执行单元,并且是可重用的,可整合的。工作流在设计好后被编译成.net程序集,它被工作流运行时和通用语言运行时(CLR)所执行。

一.创建一个Hello World工作流

在这次练习里,我们将通过VS2005工作流设计器设计一个非常简单的“Hello World”工作流。这个Hello World工作流将通过很简单的代码实现一个顺序工作流,它将在我们的命令行中输出“Hello, World!”。我们将了解工作流的定义和其代码。最后,我们将学习怎样通过VS2005在我们的机器上执行、调试我们的工作流。

打开VS 2005,新建项目,选择“顺序工作流控制台应用程序”,修改项目名称为:HelloWorldWorkflow.

图片点击可在新窗口打开查看

 

1. 点击确定我们将生成一个新的工作流项目。

2. 这个项目会为我们自动生成一个工作流模版Workflow1。在这里我们是不需要这个模版的,我们只是做一个非常简单的例子,所以我们删除这个Workflow1.cs文件。

3. 右键单击项目选择添加新项

4. 选择“顺序工作流(具有单独的代码)”,点确定添加。这里将添加两个文件Workflow1.xoml和Workflow1.xoml.cs,Workflow1.xoml包含了描述工作流类型的XML语言,而其CS后缀的的文件则包含这个工作流内的动作执行代码。

5. 下面我们要做的就是添加代码了。双击Workflow1.xoml文件来打开VS 工作流设计器视图。

6. 我们从工具箱里可以砍刀我们可以添加的各种活动。

7. 我们从工具箱中拖拽“Code”这个活动到我们的工作流当中。

8. 注意,这个时候在我们拖拽进来的“Code”这个活动的右上角有一个红色的叹号,点击下拉的小三角我们可以看到显示这个叹号的呀,是因为属性ExecuteCode还没有被设置。

图片点击可在新窗口打开查看

9. 那么下一步很明白了,我们需要设置ExecuteCode,点击这个提示,我们会发下在属性窗口的ExecuteCode会显示高亮,在其内输入codeActivity1_CodeHandler并双击,会在后台代码Workflow1.xoml.cs中生成codeActivity1_CodeHandler方法

10. 可以看到,这个类继承自 SequentialWorkflowActivity 基类. 我们要在方法中输入:

Console.WriteLine("Hello, World!");

全部代码如下:

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
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 HelloWorldWorkflow
{
public
			partial
			class Workflow1 : SequentialWorkflowActivity
{
private
			void codeActivity1_CodeHandler(object sender, EventArgs e)
{
Console.WriteLine("Hello, World!");
}
}
}

11. 按Ctrl+F5运行程序,如果出现:图片点击可在新窗口打开查看
则说明成功。

12. 是不是太简单了?至少,我们第一次的工作流编写完成了。

13. 等等,别急,还有个好玩的,那就是WWF的调试功能。我们在以前调试的时候,是要在代码中设置断点的,现在,你可以试一下调试WWF。

14. 打开工作流的设计视图Workflow1.xoml。

15. 选中我们刚才拖拽过来的codeActivity1,点右键,选断点—插入断点(或者选中后直接点F9),看到了什么?图片点击可在新窗口打开查看

6. 现在我们再按F5,在执行到这里的时候就会停止,可以进行调试了。

图片点击可在新窗口打开查看

7. 点F11单步执行将进入我们的codeActivity1_CodeHandler事件,是不是很方便?

图片点击可在新窗口打开查看

  (2)-----让WF通过参数接收数据

在这一节,我们一起学习通过其他程序调用工作流,并且在工作流启动时给工作流传递一些数据,使其在工作流中使用。

在workflow开始执行时,我们有两种方式给工作流传递数据------参数和事件。今天,我们先说说怎样通过参数来给工作流传递数据。

需要传递给workflow的参数,我们需要先在工作流中通过属性来进行设置,而后在其他程序调用这个工作流创建一个工作流的实例时,通过 Dictionary<string, object>键值集合进行传递,如下:

继续使用我们上一节用到的代码,给Workflow1 类添加两个属性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;
            }
        }

 

这里我们将通过其他应用程序传递fristName和lastName并让这两个值在工作流执行过程中以对话框的形式显示出来。

因为我们上一节中创建的是个控制台应用程序,所以让起弹出对话框需要应用System.Windows.Forms程序集。

然后修改我们的Workflow1类中的codeActivity1_CodeHandler

         private   void  codeActivity1_CodeHandler( object  sender, EventArgs e)
        {
            System.Windows.Forms.MessageBox.Show(
                    
" Hello world:  "   +  firstName  +   "   "   +  lastName);
        }


现在我们已经修改好我们要做的工作流代码了。

 

下面我们要创建一个winForm应用程序。

添加一个新的项目WinFormTestHost

图片点击可在新窗口打开查看

接下来我们要确认我们新创建的项目WinFormTestHost能够调用工作流Workflow1。

给WinFormTestHost添加引用,引用项目HelloWorldWorkflow.

图片点击可在新窗口打开查看

同时,我们还要让我们的这个winfrom应用程序引用wwf程序集。继续添加引用,选择.net选项卡,添加如下三项:

System.Workflow.Activities

System.Workflow.ComponentModel

System.Workflow.Runtime

图片点击可在新窗口打开查看

 

修改我们的Form1窗体。

添加两个Label分别为Label1和Label2,Text属性分别为First name和 LastName。

添加两个TextBox分别为txtFirstName和txtLastName。

添加一个按钮btnStartWorkflow,用来启动我们的工作流,Name属性为btnStartWorkflow,Text属性为Start Workflow。

这个简单的窗体就做完了,我们来添加代码。

首先在我们的类Form1.cs中添加工作流运行时声明:

        private  WorkflowRuntime wr;



双击btnStartWorkflow添加事件处理程序。

         private   void  btnStartWorkflow_Click( object  sender, EventArgs e)
        {
            
if  (wr  ==   null )
            {
                wr 
=   new  WorkflowRuntime();
                wr.StartRuntime();
            }

            
// 定义键和值的集合(Dictionary)用来传递参数
            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();
            
        }

最后给FormClosed事件添加一段代码,使其在关闭窗体时关闭工作流

         private   void  Form1_FormClosed( object  sender, FormClosedEventArgs e)
        {
            
if  (wr  !=   null )
            {
                
if  (wr.IsStarted)
                {
                    wr.StopRuntime();
                }
            }
        }

 

现在,我们的程序就开发完成了,点击F5,将打开窗体:

图片点击可在新窗口打开查看

我们输入名称后点Start Workflow,将弹出窗体:

图片点击可在新窗口打开查看

这个窗体是在Workflow1中执行的,同时,我们也看到,在winfrom窗体中输入的值成功的传递到了工作流中。

  (3)-----使用If/Else活动,定制活动处理工作流,使用事件传递数据

上一节我们学习了怎样通过参数传递数据,这节我们就说说通过事件传递数据的方法,由于这节除了我们自己写的一部分代码外,还需要用到另外需要触发事件的ExpenseApplication外部应用程序和所用事件示例代码,所以请下载示例程序源代码,根据需要添加项目的引用。

另外,我们将学习到怎样使用if/else 根据条件处理工作流 ,还将学习根据定制活动有条件的处理工作流。我们将在制作一个简单的处理费用支出报表的工作流中学习到这些概念。当工作流在报表数据提交的时候将接收到一个事件,这个事件的参数将把包

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值