WF学习系列之四:顺序工作流控制台应用程序模板介绍
简介
WF兼有很多角色,如编程模型、运行时引擎以及工具集等,它使我们很容易创建基于工作流的应用。这里主要分析一下VS2008下顺序工作流控制台应用程序的模板,并了解几个常见的活动。
顺序工作流控制台应用程序模板
WF提供两种类型的工作流:顺序工作流、状态机工作流。这两个工作流分别从SequentialWorkflowActivity, StateMachineWorkflowActivity派生而来。VS2008提供了顺序工作流控制台应用程序和类库两种模板,本文主要介绍顺序工作流控制台应用程序模板。
创建工作流项目
具体步骤省略,详细请参见参考文献所示。查看生成的工作流代码如下:
![](/assets/blank.gif)
![](/assets/blank.gif)
public sealed partial class Workflow1: SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}
}
很容易看出,新建的工作流Workflow1是从SequentialWorkflowActivity派生。
新建的工作流只有起始点,没有任何活动。这里我们添加一个Code activity。添加了这个活动后,我们发现,这个活动出现了错误,是因为ExecuteCode没有设定,这里只需双击Code activity即可,并在代码文件中添加Console.WriteLine("Hello, World!");。一个Hello, World!工作流就这样完成了。
解析工作流调用代码(宿主程序代码)
![](/assets/blank.gif)
![](/assets/blank.gif)
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:
![](/assets/blank.gif)
![](/assets/blank.gif)
<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学习系列之四:顺序工作流控制台应用程序模板介绍相关推荐
- 《转》VMware vSphere 5.1 学习系列之四:安装 SQL Server 数据库
为什么80%的码农都做不了架构师?>>> 目 录 一. vCenter Server数据库的配置要求 1 准备 vCenter Server 数据库 1 vC ...
- orion sam mysql_JAVA/JSP学习系列之四(Orion App Server的安装)_MySQL
一.前言 Orion这个东西,小巧,但是功能却非常多,废话不讲,看它目前的支持就知道了: (1)Servlets/JSP (2)EJB (3)HTTP (注:说明不再需要Apache或者IIS等Web ...
- SpringCloud学习系列之四-----配置中心(Config)使用详解
前言 本篇主要介绍的是SpringCloud中的分布式配置中心(SpringCloud Config)的相关使用教程. SpringCloud Config Config 介绍 Spring Clou ...
- Prometheus学习系列(四十)之报警模板参考
Prometheus创建并向Alertmanager发送警报,然后Alertmanager根据标签向不同的接收者发送通知. 接收器可以是众多集成中的一种,包括:Slack,PagerDuty,电子邮件 ...
- STM32-USB学习系列(一) :USB与USB库的介绍
目录 一.USB介绍 1.USB的背景简介 2.USB的几种概念 3.USB的插入检测 二.STM32F1-HAL库中 USB外设库的文件介绍 1.STM32_USB_Host_Library 中的文 ...
- sharepoint 2016 学习系列篇(5)-创建一个应用程序网站
前面已经完成了整个sharepoint server 2016的安装和配置,接下来,我们当然是要创建一个应用程序网站. 1.创建应用程序网站 打开sharepoint管理中心,点击Applicatio ...
- C语言 main函数参数 argc,argv 用处,控制台应用程序模板2
1.形如 main(int argc,char *argv[ ]) 2.解释 argc为整数,表示外部输入的参数个数. argv是字符串指针数组,argv[ ] 存储了每个参数字符串. 3.默认 默认 ...
- SQL Server 学习系列之五
SQL Server 学习系列之五 SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题) SQL Server 学习系列之三(SQL 关键字) SQ ...
- SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理
前言 在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由 ...
- 大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 图文详解
引言 在之前的大数据学习系列中,搭建了Hadoop+Spark+HBase+Hive 环境以及一些测试.其实要说的话,我开始学习大数据的时候,搭建的就是集群,并不是单机模式和伪分布式.至于为什么先写单 ...
最新文章
- html怎么移动文字的位置,css怎么移动文字
- VB访问SQL Server数据库技术全揭密
- 设置Linux网络的方法
- 2020年8个效率最高的爬虫框架
- 笔记:猎头如何在一周之内“摸清”一个行业
- 单身狗有福了!斯坦福教授化身丘比特,AI算法之箭帮你配真命爱侣
- final的8个小细节,听说只有高手才知道!你知道几个?
- 事务超时时间无效_Java面试题:Spring事务面试考点的集合整理。建议收藏阅读...
- 个性化推荐与知识图谱在剧本杀行业的应用与实践
- 平纹、斜纹、缎纹是什么?各自有何特点?
- javascript cookies 存、取、删除实例【转】
- abp框架 mysql_ABP框架迁移到Mysql
- 超好用epub阅读器分享
- [Unity3D]ml-agent入门案例
- 《生物化学与分子生物学》----蛋白质----听课笔记(四)
- 微软蓝牙鼠标3600拆解
- 串口通信那些事儿:通信电平转换电路
- linux cpu 降频,archlinux 给cpu降频
- SSH连接git服务器学习笔记
- SecureCRT 命令行备注
热门文章
- 计算机的概念与发展典型例题,计算机考试基本概念与典型例题.doc
- 计算机信息与自然科学,郑旭飞 - 计算机与信息科学学院 - Powered by 西南大学
- php 编译原理,php编译原理 - Robin3D的个人页面 - OSCHINA - 中文开源技术交流社区
- C/C++[codeup 1785]字符串连接
- Xcode在 release 模式下断点调试
- 用递归法计算从n个人中选择k个人的组合数
- anaconda conda 切换为清华源
- 使用boost中的线程池
- EM 算法的推导和解释
- originos是鸿蒙系统吗,originos系统是安卓吗