最近要研究下WF4.0的相关内容,将自己认识的、理解的写下来与大家共勉,有兴趣的朋友可以一起探讨一下。

相对于之前的3.0、3.5中的WorkFlow来说,4.0进行了很大的变动,包括流程设计工具、支持的活动的类型集合、工作流的内部的模型、执行引擎等等。对于其中的活动模型、执行引擎等内容,属于比较理论而且深入的内容,我会在研究到一定程度之后与大家分享,希望通过本系列文章能够和大家一起对WF3.0和4.0的区别和联系有个全面细致深入的理解。

  本文主要是对3.0和4.0之间的区别做了下简单的介绍,熟悉或者精通WF的可以跳过。

既然3.0、3.5中的WorkFlow和4.0不同,那么我们首先来对比一下。首先从设计工具说起,分别用3.5(图1)和4.0(图2)创建一个顺序工作流,我们可以看到下面的流程设计界面:

图1(3.5中的流程设计界面)

图2(4.0中的流程设计界面)

从图中我们不难看出区别,3.5中顺序工作流初始化默认有个开始和结束节点,4.0默认则是一片空白。个人感觉这是一种观念的改变,工作流始于开始、终于结束是我们传统思维,然而开始结束本身就是一个虚活动,更像是边界的限定,开发人员了解,用户却不了解;4.0所给人的信息更符合用户思维,一个流程始于活动而终于活动。基于设计出的流程,让开发者、业务建模人员、用户之间能够相互交流,分析师能够对流程进行优化,决策者能够更好的决策是一种趋势,而这种趋势必然要跨出的一步就是流程设计的可被大众理解化。

呵呵,有点扯远了。我们接着看看3.5(图3)和4.0(图4)支持的活动类型:

图3(3.5支持的活动类型)

图4(4.0支持的活动类型)

可以看到4.0支持的活动类型不仅更多,而且分类更细致。不仅在controlFlow和原始类型中提供了基础的活动,用来定制基本的流程,而且在FlowChart里面提供了能更加灵活的定制流程的活动类型,同时还提供用于消息、事务、错误处理等功能的活动

接下来看看引用的类库以及项目文件的目录结构:

.Net3.5中引用了以下类库:

System.Workflow.Activities:定义了工作流可以创建、允许的活动集合

System.Workflow.ComponentModel:提供创建活动、工作流的基类、接口以及核心建模构造

System.Workflow.Runtime:提供一些类和接口可以控制工作流运行时引擎以及流程实例的执行

默认创建的工作流是Workflow1.cs,对于设计完的流程是用类文件的形式进行描述,即Workflow1.designer.cs,执行代码放到Workflow1.cs中。

通过ViewCode可以看到两个类的代码为:

//Workflow1.cs

public sealed partial class Workflow1 : SequentialWorkflowActivity

{

public Workflow1()

{

InitializeComponent();

}

}

//Workflow1.designer.cs

partial class Workflow1

{

#region Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

[System.Diagnostics.DebuggerNonUserCode]

[System.CodeDom.Compiler.GeneratedCode("", "")]

private void InitializeComponent()

{

this.Name = "Workflow1";

}

#endregion

}

.NET4.0中WorkFlow引用了以下类库:

System.Activities:包含创建和使用活动所需的所有类。使用此命名空间中的类可以定义活动、输入输出数据和变量

System.ServiceModel:包含用于生成服务和客户端应用程序所需的类、枚举和接口,这些类、枚举和接口可以用于生成大范围的分布式程序

System.ServiceModel.Activities:使用此命名空间中的类可以从工作流接受消息,或者向工作流发送消息,定义工作流服务的时候可以使用这些活动

默认创建的是Workflow1.xaml,定义完的流程是用xml的方式进行描述。

通过ViewCode,我们可以看到WorkFlow1.xaml中的内容:

<Activity mc:Ignorable="sap"

x:Class="WFConsoleAppTest.Workflow1"

sap:VirtualizedContainerService.HintSize="240,240"

mva:VisualBasic.Settings="Assembly references and imported namespaces for internal implementation"

xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System"

xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities"

xmlns:s="clr-namespace:System;assembly=mscorlib"

xmlns:s1="clr-namespace:System;assembly=System"

xmlns:s2="clr-namespace:System;assembly=System.Xml"

xmlns:s3="clr-namespace:System;assembly=System.Core"

xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities"

xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation"

xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System"

xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel"

xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core"

xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib"

xmlns:sd="clr-namespace:System.Data;assembly=System.Data"

xmlns:sl="clr-namespace:System.Linq;assembly=System.Core"

xmlns:st="clr-namespace:System.Text;assembly=mscorlib"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" />

可以看到,对于类文件、命名空间的引用,xml使用的schema限定等都在WorkFlow1.xaml中进行了描述。

.NET3.5中Program.cs中代码如下:

class Program

{

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(WFSequenceTest.Workflow1));

instance.Start();

waitHandle.WaitOne();

}

}

}

代码中对流程实例完成、流程实例终止进行了事件的处理,然后通过用户定义的Workflow1创建WorkflowInstance,调用instance.Start()开始执行流程。

.NET4.0中Program.cs代码如下:

class Program

{

static void Main(string[] args)

{

WorkflowInvoker.Invoke(new Workflow1());

}

}

代码中创建了一个Workflow1的实例,然后通过WorkflowInvoker.Invoke来开始执行流程。

  通过对比不难发现,4.0的流程创建执行更简洁,也更符合思维习惯。以请假流程为例,请假人首先会填写个请假条,然后报领导审批就是;用工作流来描述这个过程就是,首先定义个请假流程,包括请假发起环节和请假审批环节,流程定义好之后,谁想请假了,填写请假表单,提交到领导审批环节即可;如果用程序来描述那就是设计一个请假流程(类、xaml等),创建实例并执行。我们很有可能会忘记一些事件的定制,然而有些情况下这往往会导致流程出现一些问题,例如3.5中我们需要定制两个事件,创建并开始流程实例的代码也比较繁琐。

总起来说4.0更灵活,更全面,更符合发展趋势。

  文章比较浅,希望大家能通过这篇文章对3.0和4.0Workflow之间的不同有个感性的认识。
关注技术文章飞秋:http://www.freeeim.com/,24小时专业转载。

【飞秋】WF3.0和4.0区别介绍相关推荐

  1. 飞秋官方下载 某些大型企业

    现在西方神奇的土地要求 飞秋官方下载 某些大型企业如沃尔玛在向陶瓷的小型企业采购廉价产品时,必须要求这些小型企业通过国际劳工组织的SA8000标准,这个标准,说白了,就是要求企业必须关注劳动者的各项权 ...

  2. 持续15秒的飞秋2.0

    摘要:飞秋2.0 2012年07月22日团队任务时可以协助奶妈,在制定5码半径区域召唤一场奇迹之雨,发现小琦的外貌形象与神墓游戏中晨曦的设计稿非常相像,推荐配合使用几个装备精灵技能,2010年遭受重创 ...

  3. 127.0.0.1和0.0.0.0和localhost的区别

    127.0.0.1和0.0.0.0和localhost的区别 127.0.0.1 172.0.0.1是本地还回地址,专供自己访问自己,速度快(不用经过整个协议栈),永远都不能出现在主机外部的网络中,所 ...

  4. a[0]和a 的区别?

    &a[0]和&a 的区别? 1)a[0]是一个元素,a 是整个数组. 2),虽然&a[0]和&a的值一样,但其意义不一样.前者是数组首元素的首地址,而后者是数组的首地址 ...

  5. 计算机usb接口充电效率差,usb2.0和3.0的区别 从传输速度和充电效率等来区别

    在选择电脑主板的时候,一般都会看一下主板的USB接口是2.0还是3.0.很多人都知道3.0应该比2.0要好,那么具体好在哪里,usb2.0和usb3.0的区别有哪些?下面将从传输速度.充电效率和接线接 ...

  6. android 5.0 ios 8,Android 5.0和iOS8.1哪个好?安卓5.0与iOS8.1区别对比

    Android和iOS显然是目前最受欢迎的移动平台,也是最大的两个竞争者.在今年,谷歌和苹果都对各自的系统进行了更新,其中iOS8.1已经正式推送,相信各位苹果用户已经正在使用:而Android 5. ...

  7. http介绍(3)http1.0 和http1.1 区别

    翻了下HTTP1.1的协议标准RFC2616,下面是看到的一些它跟HTTP1.0的差别. 1. Persistent Connection持久连接      在HTTP1.0中,每对Request/R ...

  8. 浅谈JQuery中$('.classname').get(0); $('.classname').eq(0); $('.classname')[0]三者的区别

    举例浅谈JQuery中$('.classname').get(0); $('.classname').eq(0); $('.classname')[0]三者的区别 demo Dom结构: <di ...

  9. 硬件知识:USB3.0和USB2.0的区别,看完你就懂了!

    1.USB的概念介绍 USB是计算机公司和通信公司在1994年联合制定的新一代接口标准,全称为通用串行总线 (Universal Serial Bus,USB) .USB 总线作为一种高速串行总线,其 ...

最新文章

  1. WebStorm React JS语法报错问题
  2. C# 系统应用之透明罩MyOpaqueLayer实现360界面阴影效果
  3. 记录一下:关于mysql数据误删除恢复的问题
  4. 重置mariadb密码
  5. L3-1 森森旅游 (30 分)
  6. 2018-06-18
  7. 【flink】95-260-045-源码-检查点-CheckPoint
  8. python 识别登陆验证码图片(完整代码)_Python 实现简单图片验证码登录
  9. 启动tomcat时遇到的问题
  10. jq+layui之保存修改的表状态
  11. 基于Java+SpringBoot+vue+elementui农产品物流系统详细设计实现
  12. java sw_APDU格式详解
  13. 登录和访问EI(Engineering Village)数据库查找文献
  14. 细数SAP Business One主流实施与服务商
  15. 【IDE】IAR for ARM官网下载链接(包含一些历史版本)
  16. IOS天气预报(美化)
  17. HTML页面查看world等文件,网页文件 - HTML - 网页基础 - KK的小故事
  18. uniapp+uniCloud实现批量上传图片到云端(解决h5端跨域问题)
  19. VAE with a VampPrior
  20. 神武手游宠物加点方法及属性参考

热门文章

  1. 冒泡排序的双重循环理解
  2. JAVA面试题(1~95)《上》
  3. python的继承用法_python之继承中组合用法与菱形继承关系查找法
  4. cclink 和发那科机器人_FANUC机器人焊枪工具坐标系设定
  5. git rebase --skip_可冒充git大神的git tips
  6. 作者:胡良霖(1973-),男,中国科学院计算机网络信息中心高级工程师
  7. 《大数据》第1期“动态”——站在大数据的风口上
  8. 并非最边界的情况“OK“就真的“OK“(记洛谷P1720WA的经历,Java语言描述)
  9. Skype for Business Server 2019 本地部署
  10. datagrid——jQuery EasyUI