简介

WF兼有很多角色,如编程模型、运行时引擎以及工具集等,它使我们很容易创建基于工作流的应用。这里主要分析一下VS2008下顺序工作流控制台应用程序的模板,并了解几个常见的活动。

顺序工作流控制台应用程序模板

WF提供两种类型的工作流:顺序工作流、状态机工作流。这两个工作流分别从SequentialWorkflowActivity, StateMachineWorkflowActivity派生而来。VS2008提供了顺序工作流控制台应用程序和类库两种模板,本文主要介绍顺序工作流控制台应用程序模板。

创建工作流项目

具体步骤省略,详细请参见参考文献所示。查看生成的工作流代码如下:

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

很容易看出,新建的工作流Workflow1是从SequentialWorkflowActivity派生。

新建的工作流只有起始点,没有任何活动。这里我们添加一个Code activity。添加了这个活动后,我们发现,这个活动出现了错误,是因为ExecuteCode没有设定,这里只需双击Code activity即可,并在代码文件中添加Console.WriteLine("Hello, World!");。一个Hello, World!工作流就这样完成了。

解析工作流调用代码(宿主程序代码)

Code
static void Main(string[] args)

{

// 创建工作流运行时引擎,为工作流初始化提供可配置的运行环境

using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())

{

// 防止工作流线程没有执行完成,主线程就退出。

// 工作流线程完成后,通过Set方法通知主线程,工作流线程已经完成。

AutoResetEvent waitHandle = new AutoResetEvent(false); // 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(WorkflowDemo1.Workflow1));

instance.Start();

// 主线程在此阻塞,直到工作流线程发出通知(waitHandle.Set())

waitHandle.WaitOne();

}

}

注意:

1. 通过WorkflowRuntime类为工作流初始化提供可配置的运行环境

2. 通过AutoResetEvent类,协调主线程和工作流线程。

3. 通过WorkflowInstance类创建工作流实例。

创建一个比Hello, World更高级的工作流

作业:创建一个工作流,使之支持一个文件加中的所有文件拷贝到另外一个文件夹。

思路:

1.创建一个代码活动,解析从宿主程序传来的源文件夹和目的文件夹;

2.创建一个循环活动(一个个拷贝,直到所有文件拷贝完毕)

在循环活动中嵌入代码活动,完成单个文件的拷贝

这里需要解释几个问题:

循环活动条件设置

在while activity活动中,规则采用声明性规则条件,当前是第几个文件 < 总共几个文件。在后台生成如下文件workflow.rules:

Code
<RuleDefinitions xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">

<RuleDefinitions.Conditions>

<RuleExpressionCondition Name="条件1">

<RuleExpressionCondition.Expression>

<!--操作符定义为小于号-->

<ns0:CodeBinaryOperatorExpression Operator="LessThan" xmlns:ns0="clr-namespace:System.CodeDom;Assembly=System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">

<!--左边的值-->

<ns0:CodeBinaryOperatorExpression.Left>

<ns0:CodeFieldReferenceExpression FieldName="currentFile">

<ns0:CodeFieldReferenceExpression.TargetObject>

<ns0:CodeThisReferenceExpression />

</ns0:CodeFieldReferenceExpression.TargetObject>

</ns0:CodeFieldReferenceExpression>

</ns0:CodeBinaryOperatorExpression.Left>

<!--右边的值-->

<ns0:CodeBinaryOperatorExpression.Right>

<ns0:CodePropertyReferenceExpression PropertyName="totalFiles">

<ns0:CodePropertyReferenceExpression.TargetObject>

<ns0:CodeThisReferenceExpression />

</ns0:CodePropertyReferenceExpression.TargetObject>

</ns0:CodePropertyReferenceExpression>

</ns0:CodeBinaryOperatorExpression.Right>

</ns0:CodeBinaryOperatorExpression>

</RuleExpressionCondition.Expression>

</RuleExpressionCondition>

</RuleDefinitions.Conditions>

</RuleDefinitions>

在后台,通过

System.Workflow.Activities.Rules.RuleConditionReference ruleconditionreference1 = new System.Workflow.Activities.Rules.RuleConditionReference();

ruleconditionreference1.ConditionName = "条件1";

this.whileActivity1.Condition = ruleconditionreference1;

进行加载到循环活动中。

宿主程序和工作流的通讯

如何向工作流中传递参数:

在工作流中定义成员变量:

public string toFolder { get; set; }

public string fromFolder { get; set; }

public int totalFiles { get; set; }

在宿主程序初始化工作流实例的时候,将参数传入

var parameters = new Dictionary<string, object>();

parameters.Add("fromFolder", @"K:"test");

parameters.Add("toFolder", @"K:"backup");

WorkflowInstance instance =

workflowRuntime.CreateWorkflow(

typeof(WorkflowDemo1.Workflow1), parameters);

如何从工作流中获取参数:

从WorkflowCompletedEventArgs e 中,即可获取工作流中的相关信息,如:e.OutputParameters["totalFiles"]。

参考文献

本翻译没有按照原文,详细请查阅

http://social.msdn.microsoft.com/content/en-us/msft/netframework/wf/learn/Intro-SequentialWorkflows

转载于:https://www.cnblogs.com/mjgforever/archive/2008/12/10/1352299.html

WF学习系列之四:顺序工作流控制台应用程序模板介绍相关推荐

  1. 《转》VMware vSphere 5.1 学习系列之四:安装 SQL Server 数据库

    为什么80%的码农都做不了架构师?>>>    目 录 一.    vCenter Server数据库的配置要求    1 准备 vCenter Server 数据库    1 vC ...

  2. orion sam mysql_JAVA/JSP学习系列之四(Orion App Server的安装)_MySQL

    一.前言 Orion这个东西,小巧,但是功能却非常多,废话不讲,看它目前的支持就知道了: (1)Servlets/JSP (2)EJB (3)HTTP (注:说明不再需要Apache或者IIS等Web ...

  3. SpringCloud学习系列之四-----配置中心(Config)使用详解

    前言 本篇主要介绍的是SpringCloud中的分布式配置中心(SpringCloud Config)的相关使用教程. SpringCloud Config Config 介绍 Spring Clou ...

  4. Prometheus学习系列(四十)之报警模板参考

    Prometheus创建并向Alertmanager发送警报,然后Alertmanager根据标签向不同的接收者发送通知. 接收器可以是众多集成中的一种,包括:Slack,PagerDuty,电子邮件 ...

  5. STM32-USB学习系列(一) :USB与USB库的介绍

    目录 一.USB介绍 1.USB的背景简介 2.USB的几种概念 3.USB的插入检测 二.STM32F1-HAL库中 USB外设库的文件介绍 1.STM32_USB_Host_Library 中的文 ...

  6. sharepoint 2016 学习系列篇(5)-创建一个应用程序网站

    前面已经完成了整个sharepoint server 2016的安装和配置,接下来,我们当然是要创建一个应用程序网站. 1.创建应用程序网站 打开sharepoint管理中心,点击Applicatio ...

  7. C语言 main函数参数 argc,argv 用处,控制台应用程序模板2

    1.形如 main(int argc,char *argv[ ]) 2.解释 argc为整数,表示外部输入的参数个数. argv是字符串指针数组,argv[ ] 存储了每个参数字符串. 3.默认 默认 ...

  8. SQL Server 学习系列之五

    SQL Server 学习系列之五 SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题) SQL Server 学习系列之三(SQL 关键字) SQ ...

  9. SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

    前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...

  10. 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解

    引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...

最新文章

  1. html怎么移动文字的位置,css怎么移动文字
  2. VB访问SQL Server数据库技术全揭密
  3. 设置Linux网络的方法
  4. 2020年8个效率最高的爬虫框架
  5. 笔记:猎头如何在一周之内“摸清”一个行业
  6. 单身狗有福了!斯坦福教授化身丘比特,AI算法之箭帮你配真命爱侣
  7. final的8个小细节,听说只有高手才知道!你知道几个?
  8. 事务超时时间无效_Java面试题:Spring事务面试考点的集合整理。建议收藏阅读...
  9. 个性化推荐与知识图谱在剧本杀行业的应用与实践
  10. 平纹、斜纹、缎纹是什么?各自有何特点?
  11. javascript cookies 存、取、删除实例【转】
  12. abp框架 mysql_ABP框架迁移到Mysql
  13. 超好用epub阅读器分享
  14. [Unity3D]ml-agent入门案例
  15. 《生物化学与分子生物学》----蛋白质----听课笔记(四)
  16. 微软蓝牙鼠标3600拆解
  17. 串口通信那些事儿:通信电平转换电路
  18. linux cpu 降频,archlinux 给cpu降频
  19. SSH连接git服务器学习笔记
  20. SecureCRT 命令行备注

热门文章

  1. 计算机的概念与发展典型例题,计算机考试基本概念与典型例题.doc
  2. 计算机信息与自然科学,郑旭飞 - 计算机与信息科学学院 - Powered by 西南大学
  3. php 编译原理,php编译原理 - Robin3D的个人页面 - OSCHINA - 中文开源技术交流社区
  4. C/C++[codeup 1785]字符串连接
  5. Xcode在 release 模式下断点调试
  6. 用递归法计算从n个人中选择k个人的组合数
  7. anaconda conda 切换为清华源
  8. 使用boost中的线程池
  9. EM 算法的推导和解释
  10. originos是鸿蒙系统吗,originos系统是安卓吗