WF4.0 Activities<第一篇>
一、基元工具
1、Delay
Delay用于延迟一段时间执行下面的流程。在WF中实例是单线程运行的,Delay并不是Thread.Sleep方法实现的。
Delay有一个Duration属性,用于设置间隔多长时间后继续往下执行。
工作流如下:

输出如下:

2、Assign
Assign主要用于为变量赋值。对于允许创建变量的活动,右键=>创建变量,就能够添加一个变量。
新建一个工作流如下:

首先定义一个变量"i",其默认值为0,通过Assign设置其默认值。
以上程序输出"1"。
3、InvokedMethod
InvokedMethod用于调用一个方法。
如对于里面的一个字符串变量要调用一个Replace()的示例如下:

各个属性说明如下:
| 属性 | 说明 |
| TargetType | 要调用的方法的类名(静态方法会用到) |
| TargetObject | 要调用方法的实例(没有就new啊) |
| MethotName | 要调用的方法名 |
| Parameters | 要传到方法的参数(有输入、输出、输出/输出分别对应C#的正常传入、out关键字、ref关键字) |
| Result | 得到的结果赋值到哪里 |
| GenericTypeArguments | 如果是泛型,则用GenericTypeArguments参数传递泛型类型 |
| RunAsynchronously | 是否异步调用 |
4、InvokedMethod
http://msdn.microsoft.com/zh-cn/library/hh305737.aspx
二、事务
1、WriteLine
WriteLine用于往控制台输出一段字符串。WriteLine有两个属性"Text"与"TextWriter"。
- Text:接收一段字符串,然后用TextWriter输出!
- TextWriter:接收一个TextWriter对象,用TextWriter输出Text的内容!

分别设置其属性如下:

代码如下:
namespace WorkflowConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Activity workflow1 = new Workflow1();
WorkflowInvoker.Invoke(workflow1);
Console.ReadKey();
}
}
//用自定义TestWriter输出Text里的内容
public class CustomTextWriter : TextWriter
{
public override Encoding Encoding
{
get { return Encoding.UTF8; }
} public override void WriteLine(string value)
{
Console.WriteLine("自定义TextWriter输出:" + value);
}
}
}
显示如下:

三、集合
集合中有4个活动,都是用于对集合进行各种操作。
- AddToCollection<T> 添加一个项到指定集合中;
- ClearCollection<T> 清除指定集合的所有项;
- ExistsInCollection<T> 判断一个指定项是否存在集合中;
- RemoveFromCollection<T> 从集合中移除一个元素;
它们的属性大都相似,如下表格所示:
| 属性 | 说明 |
| Collection | 集合的对象名 |
| Item | 元素值 |
| TypeArgument | 集合的泛型类型,即List<T>中的T |
| Result | 结果存放到哪个变量 |
示例都懒得贴上来了,使用方法很简单。唯一要注意的一点是这些控件是对现有集合对象进行操作。因此,首先要定义一个集合变量如:

四、控制流工具
1、IF
If用于根据条件判断流程做选择的分支。它有一个Condition属性,用于接收一个bool类型的参数。如果Condition为true,则执行Then。如果Condition为false,则执行Else。
当然,还能够在If里增加一个变量,让流程根据变量得到Condition结果,执行。
一个最简单的If示例如下:

2、Switch<T>
根据条件,执行不同的分支,与C#的Switch意义相同。只不过Case、Default后面跟着的不是代码,而是Activity!

3、While
While有一个Condition条件,通常会配合变量来使用。Body为循环的活动主体。下面实现一个逻辑如下:
while(i<)
{
Console.WriteLine("还小于10!");
i++;
}
对应的流程图如下:

需定义一个变量i。运行结果与上面代码一样。
4、DoWhile
DoWhile中可以定义变量,与C#语法中的dowhile一致。无论条件如何,至少执行一次。
下面给出一个逻辑如下的示例:
static void Main(string[] args)
{
int i = ;
do
{
Console.WriteLine("还小于10!");
i++;
}
while (i < );
Console.ReadKey();
}
如下:

5、ForEach<T>
Foreach<T>与C#语法里的foreach同义。
下面的流程实现的逻辑如下:
static void Main(string[] args)
{
int[] IntArr = new int[] { , , , , };
foreach (int item in IntArr)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
流程图:

6、Parallel
Parallel并行执行容器,放在该容器内的活动会并发执行,它有一个属性"CompletionCondition",当此属性为真时,有一个顺序执行完成,流程不再等待其他没执行完成的分支,直接往下执行。
Parallel并非多线程并行,而是Parallel是在单线程中轮换执行各分支。当所有分支中的节点都执行完成后,该Parallel节点才继续工作流。所有分支都是在同一条线程上执行。
其作用情景为:只有两个分支都执行才往下走。
示例如下:

以上代码,当CompletionCondition设置为true时,仅仅输出1 2 3 4。如果设置为false,输出1 2 3 4 5 6。
7、Pick,PickBranch(只有最先开始的那条分支会被执行)
- Pick触发容器,提供了基于事件的控制流,Branches集合是触发容器的分支集合,只能添加PickBranch。
- PickBranch只可添加到Pick中,PickBranch.Trigger只能放入触发类Activity,PickBranch.Action当PickBranch.Trigger 被触发时,所要执行的Activity。
- Pick触发容器中可以定义变量。
- 只要有一个PickBranch的Trigger被触发,其他PickBranch就不会被触发了。
- 即使在被执行的PickBranch还没完成时,其他PickBranch也不会被触发。

只输出一个1。
8、ParallelForEach<T>
每次迭代就检查一次CompletionCondition 属性,当其为真时。本环节结束,往下执行。

如上面的例子,当设置CompletionCondition为false时,只输出20。
9、Sequence
Sequence顺序容器,用于存放一系列活动,顺序执行。

如以上顺序输出字符串。
五、流程图
流程图内一共有3个控件,
- Flowchart 流程图容器,里面放置流程,里面能够放置顺序流;
- FlowDecision 用于根据条件判断流程走向(if else);
- FlowSwitch 根据条件,决定流程走向(switch);
当然以上3个控件都是要配合参数传入才能发挥最大的效用。

当然,我在里面设置了一个变量,用于试验Switch。实际上,以上程序输出"是的",与Switch并没太大关系,Switch只是判断FlowChart里的变量。
Flowchart属性
| 属性 | 说明 |
| ValidateUnconnectedNodes | 是否验证所有未连接的节点 |
FlowDecision属性
| 属性 | 说明 |
| Condition | 判断条件表达式 |
| FalseLabel | 为False时线上显示的内容 |
| TrueLabel | 为True时线条上显示的内容 |
FlowSwitch属性
| 属性 | 说明 |
| Expression | 用于判断的内容switch (xxx就是这个东西) |
六、状态机
1、StateMachine
用于装载状态机工作流。
2、State
状态,它有3个主要属性。
- Entry 进入状态时执行的活动;
- Exit 离开状态时执行的活动;
- Transitions 能够转换到的状态;
3、FinalState
当状态机执行完毕时使用的状态。
只有一个属性Entry,与State的同义。
一个最简单的工作流示例:


定义一个变量i=5,流程输出如下:

七、运行时
1、Persist
持续化活动,当工作流运行至此活动时,调用实例的Persist()方法,执行一次持续化操作。
可参见:http://www.cnblogs.com/kissdodog/p/3993405.html
2、NoPersistScope
非持续化容器,执行此活动时,禁止工作流持续化直至此容器内的活动执行完毕。

3、TerminateWorkflow
当工作流执行此活动时,报一个异常并终止工作流运行。
两个属性:
| 属性 | 说明 |
| Exception | 异常类型 |
| Reason | 原因 |
执行此活动,相当于调用了一次流程实例的Terminate()方法。
WF4.0 Activities<第一篇>的更多相关文章
- WF4.0 基础篇 (一)开始使用WF
来源:https://www.cnblogs.com/caosenianhuan/p/WF.html 最近公司要重新上线一套新的CRM系统,要重整老系统里的业务流模块,团队讨论已微软的workflow ...
- 【转】WF4.0 (基础篇)
转自:http://www.cnblogs.com/foundation/category/215023.html 作者:WXWinter —— 兰竹菊梅★春夏秋冬☆ —— wxwinter@16 ...
- 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)
从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...
- WF4.0 基础篇 (十八) Flowchar
本节主要介绍WF4 中 Flowchart的使用 本文例子下载: http://files.cnblogs.com/foundation/FlowcharSample.rar 本文例子说明 Flowc ...
- 分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)——第一篇
分布式文件系统 FastDFS 5.0.5 & Linux CentOS 7 安装配置(单点安装)--第一篇 简介 首先简单了解一下基础概念,FastDFS是一个开源的轻量级分布式文件系统,由 ...
- Entity Framework 6.0 入门系列 第一篇
Entity Framework 6.0 入门系列 第一篇 好几年前接触过一些ef感觉不是很好用,废弃.但是 Entity Framework 6.0是经过几个版本优化过的产物,性能和功能不断完善,开 ...
- 第一篇:SpringBoot2.0简单介绍
距离Spring Boot1.0发布已经4年了,今年3月份SpringBoot2.0正式发布.让我们一起来了解一下它. Spring Boot主要依赖于Spring,整合了很多框架的使用方式,帮助开发 ...
- WF4.0(3)----变量与参数
已经写了两篇关于WF4.0的博客,算是基础博客,如果是WF比较熟悉就直接跳过吧,如果你对工作流不是很熟悉,或者想了解一下基础的东西,本文还是比较适合你的.工作流中变量,参数,表达式属于数据模型中概念, ...
- WF4.0(2)----设计工作流
自从做了程序员,发现自己长胖了,而且自己的身体抵抗力也出了问题,最近身体不适,公司工作任务最近也很赶,上次写了WF4.0的简介,这次就工作中工作流设计的几种方式稍微总结一下.设计工作流包括四种方式:流 ...
随机推荐
- C# ASP.NET 开发指引简要
推荐学习交流社区:博客园http://www.cnblogs.com/ 里面有很多技术.职业圈子等信息的分享,新手必逛社区. 电子书等资源下载:csdn下载 http://download.csdn. ...
- 如何写出小而清晰的函数?(JS 版)
本文以 JavaScript 为例,介绍了该如何优化函数,使函数清晰易读,且更加高效稳定. 软件的复杂度一直在持续增长.代码质量对于保证应用的可靠性.易扩展性非常重要. 然而,几乎每一个开发者,包括我 ...
- hdu1358 Period
首先给个博客:http://blog.csdn.net/lttree/article/details/20732385 感觉他说的很好,尤其是引用的那个博客,清晰的说明了循环节的两个公式. http: ...
- IT项目管理
IT项目管理是项目管理在IT领域的应用,结合IT行业特点运用项目管理技术.理念和方法,包括9大知识领域(项目综合.范围.时间.成本.质量.人力资源.沟通.风险和采购管理)以及启动.计划.实施.控制和收 ...
- eclipse ide for java ee developers 开发环境搭建(j2ee)
转载自:http://www.iteye.com/topic/982182 真的是一片很不错的文章啊! 使用eclipse真的有年头了,相信java程序员没有不知道它的,最近在给团队中新来的应届生做指 ...
- 用java程序调用ffmpeg执行视频文件格式转换flv
用java小例题说明更直观:(可以直接编译运行)环境我在windows平台下测试的...需要在e:/下有ffmpeg.exe;mencoder.exe;drv43260.dll;pncrt.dll共4 ...
- orientationchange不管用啊
首先引入JQuery Mobile包,将 <script> //手持设备方向改变时执行 $(window).bind( 'orientationchange', function(e){ ...
- C# 学习的随笔【随时更新】
1.结束自己 Application.Exit(); //这个东西有重载函数
- window8.1中用户的管理员权限的提升方法
1.使用命令netplwiz 2.点击确定后出现如下所示的内容,选择待修改的用户 3.然后点击属性,出现如图的内容 在上图中选中管理员左侧的单选按钮便可以了,将当前用户提升为管理员账户.
- Cocos2d-x下Lua调用自定义C++类和函数的最佳实践[转]
Cocos2d-x下Lua调用C++这事之所以看起来这么复杂.网上所有的文档都没讲清楚,是因为存在5个层面的知识点: 1.在纯C环境下,把C函数注册进Lua环境,理解Lua和C之间可以互相调用的本质 ...