Windows Workflow Foundation中的基本活动(Basic Activities)

CodeActivity

The Code Activity's only interesting feature is its ExecuteCode event.We can write some code in the event. When the Code Activity is activitied, the code will be executed.

It might seem useful to execute arbitrary code in a workflow, but in reality the Code activity should appear relatively infrequently and as a special case. Instead of using Code activities, we should look to package code into custom activities.

IfElseActivity

Inside an IfElse activity are one or more IfElseBranch activities. Each branch activity has a Condition property. We are required to o set the Condition property on all branches, except for the last branch.

分支的执行

IfElseActivity有多个分支,分支按从左向右执行,那个分支符合条件,就执行,如果没有分支满足条件,则跳出IfElseActivity,如果最后一个分支没有条件,则最后一个分支会执行(除非其他的分支不满足条件)。这个和程序语言的if类似。

添加分支

在IfElseActivity上点击右键,选择"Add Branch“可以添加分支。

条件设置

条件分为Code Condition和Declare Rule Condition两种。

WhileActivity

WhileActivity也有一个Condition,WhileActivity里面还可以包含一个其他的Activity,它包含的Activity会执行,直到Condition为True。 注意,While里面只能有一个Activity,如果想在WhileActivity中执行多个Activity,则可以把这些Activity放在下面的SequenceActivity中。

SequenceActivity

是一个复合的Activity(Composite Activity),里面可以包含至活动(Child Activity)。

SuspendActivity挂起活动

当一个工作流的流转过程中出现问题,需要人工干预的时候,可以将工作流挂起,这个时候Host应用程序可以订阅WFInstance的WorkflowSuspended事件,并通过查询WorkflowSuspendedEventArgs事件参数中的Error属性来获取工作流的异常信息,这个事件参数还包含有一个WorkflowInstance属性,Host可以通过补充相应的数据后重启工作流实例(利用WorkflowInstance的Resume方法),也可以调用Terminate方法终止一个WorkflowInstance。

TerminateActivity

和SuspendActivity类似,TerminateActivity也会停止工作流的运行,不过和SuspendActivity不同的是,一个Workflow被Terminate后,不能恢复。同样的,Host应用程序也可以订阅WorkflowInstance的WorkflowTerminated事件,通过WorkflowTerminatedEventArgs的Error属性获取工作流运行失败的信息,并可以把Error信息包装为WorkflowTerminatedException抛出。

TerminateActivity和ThrowActivity的区别:如果你想在WorkflowTerminated处理器中制定是那种异常,那么你需要用ThrowActivity,ThrowActivity让你有机会捕获一个抛出的异常,并继续,但TerminateActivity始终会抛出异常,并终止Workflow。

ThrowActivity

ThrowActivity的用法上面已经说了,当执行一个ThrowActivity后,Host可以通过订阅WorkflowTerminated事件来获取Throw的Exception。但是ThrowActivity抛出异常后,WorkflowInstance会继续执行。抛出的异常可以在ThrowActivity的Fault属性中指定。

InvokeWorkflowActivity

InvokeWorkflowActivity会一步的执行另外一个Workflow。执行是异步的,部门不能检索其他Workflow的输出参数。可以通过其他的与Host的通讯机制来获取输出参数。

我们可以把自己的工作流的属性或者字段作为参数与Target Workflow的Public属性绑定。在启动Target Workflow之前,当前的Workflow会触发一个Invoking的事件,我们可以在Invoking事件的处理器中组织和初始化相应的参数。

InvokeWorkflowActivity非常有用,它在很大程度上增强了流程的可重用性。

ParallelActivity

并行活动,顾名思义,它可以让ParallelActivity中的多个活动独立的执行,(但并不是不同的分支在多个线程中运行,实际上不同的分支还是在同一个线程里面运行)。可以用投票系统来解释ParallelActivity。多个投票分支,投票无先后约束,哪一个投票到了,Workflow就会处理,并继续侦听其他的投票,直到所有的投票都完成。(ParallelActivity要求所有的分支都完成,Activity才算完成)。(这个和Biztalk里面的是一样的)。

DelayActivity

等待一段时间。

ListenActivity

ListenActivity也有多个分支,和并行活动所不同的是,ListenActivity的分支中,只要有一个分支完成了,ListenActivity就算完成了。ListenActivity中常常有一个分支是DelayActivity,让Workflow等待一段时间,如果侦听的事件还没有触发,则结束侦听。

EventHandlingScopeActivity

事件处理范围活动也有多个分支并行的侦听和处理外部事件,但是和Listen和Parallel活动不同的是,它又一个main child activity,在main child activity执行前,所有的分支可以并行的处理,当main child activity执行后,EventHandlingScopeActivity就执行完毕。一个典型的例子是在规定的时间内统计投票,这里面main child activity是一个DelayActivity,设定为等待的时间。

SynchronizationScopeActivity

和.NET程序中的线程同步类似,SynchronizationScope Activity可以使得共享资源的访问串行化(甚至可以在workflow instances之间串行化)。如果在我们的workflow definition中有一个static的字段(在VB中是shared field),SynchronizationScopeActivity可以确保在此活动的持续期间,只有一个实例有该字段的读或者写权限。

ReplicatorActivity

如何使用ReplicatorActivity呢?ReplicatorActivity有点类似WhileActivity,但是比它更复杂。

posted @ 2008-02-01 23:34  navyliu  阅读(652)  评论(0编辑  收藏  举报