Activity容器控件

IfElseActivity

1.IfElseActivity有两个IfElseBranch子控件,分别作为IfElse的两个分支容器,系统自动添加,

2.其中左边(为真件条)的IfElseBranch容器要设Condition

3.IfElse左边(为真件条)的IfElseBranch容器的Condition有两个条件模式:Code Condition,Declarative Rule Condition

 

Code Condition模式

Code Condition模式,由对e.Result赋不同值决定执行不同的分支

要使用该模式,会在代码中用到CodeCondition对象与CodeCondition对象的Condition事件

IfElseActivity

IfElseBranch1

IfElseBranch2

 

Activities.CodeCondition

Condition事件

(Object sender, System.Workflow.Activities.ConditionalEventArgs e)

 

 

手工

代码

 

从下拉框绑定时如报错

Dim codecondition1 As Workflow.Activities.CodeCondition = New CodeCondition

AddHandler codecondition1.Condition, AddressOf Me.ifElse_a_Condition

Me.ifElseBranchActivity1.Condition = codecondition1

System.Workflow.Activities.CodeCondition codecondition1 = new CodeCondition();

codecondition2.Condition += new System.EventHandler<Activities.ConditionalEventArgs>(this.ifElse1_Condition);

this.ifElseBranch1.Condition = codecondition2;

 

 

 

方法

格式

 'Code Condition模式的判断,由对e.Result赋不同值决定执行不同的分支

 Private Sub ifElse_a_Condition(ByVal sender As Object, ByVal e As Workflow.Activities.ConditionalEventArgs)

        'e.Result如果为真,就执行左边(为真件条)的IfElseBranch容器

        'e.Result如果为假,就执行右边(为假件条)的IfElseBranch容器

        If temp = "456" Then

            e.Result = True

        Else

            e.Result = False

        End If

    End Sub

        void ifElse1_Condition(Object sender, System.Workflow.Activities.ConditionalEventArgs e)

        {

            if (wxwinter = "lzm")

            { e.Result = true; }

            else

            { e.Result = false; }

          }

 

 

Declarative Rule Condition模式

Declarative Rule Condition模式:由指定的表达式的值是否符合条件定执行不同的分支

 

 Dim ruleconditionreference1 As Workflow.Activities.Rules.RuleConditionReference = New .RuleConditionReference

 ruleconditionreference1.ConditionName = "Condition1"

 Me.ifElseBranchActivity3.Condition = ruleconditionreference1

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

ruleconditionreference1.ConditionName = "abcd";

this.ifElseBranch3.Condition = ruleconditionreference1;

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

      <RuleDefinitions.Conditions>

           <RuleExpressionCondition Name="abcd">

                 <RuleExpressionCondition.Expression>

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

                            <ns0:CodeBinaryOperatorExpression.Left>

                                  <ns0:CodeFieldReferenceExpression FieldName="wxwinter">

                                       <ns0:CodeFieldReferenceExpression.TargetObject>

                                             <ns0:CodeThisReferenceExpression />

                                       </ns0:CodeFieldReferenceExpression.TargetObject>

                                  </ns0:CodeFieldReferenceExpression>

                            </ns0:CodeBinaryOperatorExpression.Left>

                            <ns0:CodeBinaryOperatorExpression.Right>

                                  <ns0:CodePrimitiveExpression>

                                       <ns0:CodePrimitiveExpression.Value>

                                             <ns1:String xmlns:ns1="clr-namespace:System;Assembly=mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">wxd</ns1:String>

                                       </ns0:CodePrimitiveExpression.Value>

                                  </ns0:CodePrimitiveExpression>

                            </ns0:CodeBinaryOperatorExpression.Right>

                      </ns0:CodeBinaryOperatorExpression>

                 </RuleExpressionCondition.Expression>

           </RuleExpressionCondition>

      </RuleDefinitions.Conditions>

</RuleDefinitions>

 

手工

代码

 

从下拉框绑定时如报错

Dim codecondition1 As Workflow.Activities.CodeCondition = New CodeCondition

AddHandler codecondition1.Condition, AddressOf Me.ifElse_a_Condition

Me.ifElseBranchActivity1.Condition = codecondition1

System.Workflow.Activities.CodeCondition codecondition1 = new CodeCondition();

codecondition2.Condition += new System.EventHandler<Activities.ConditionalEventArgs>(this.ifElse1_Condition);

this.ifElseBranch1.Condition = codecondition2;

 

 

 

方法

格式

 'Code Condition模式的判断,由对e.Result赋不同值决定执行不同的分支

 Private Sub ifElse_a_Condition(ByVal sender As Object, ByVal e As Workflow.Activities.ConditionalEventArgs)

        'e.Result如果为真,就执行左边(为真件条)IfElseBranch容器

        'e.Result如果为假,就执行右边(为假件条)IfElseBranch容器

        If temp = "456" Then

            e.Result = True

        Else

            e.Result = False

        End If

    End Sub

        void ifElse1_Condition(Object sender, System.Workflow.Activities.ConditionalEventArgs e)

        {

            if (wxwinter = "lzm")

            { e.Result = true; }

            else

            { e.Result = false; }

          }

 

 

Declarative Rule Condition模式

Declarative Rule Condition模式:由指定的表达式的值是否符合条件定执行不同的分支

 

 

WhileActivity

提供了一个条件循环容器,Condition有两个条件模式:Code Condition,Declarative Rule Condition设置见IfElseActivity

SequenceActivity

System.Workflow.Activities

 

功能:

1.一个简单的的容器,容器里的结点按序顺执行

2.在中ParallelActivity中作为分支容器

说明:

1.SequenceActivity容器以排列好的方式依次运行容器内的子结点

2.当所有的子结点都完成时,SequenceActivity结点结束

3.从SequenceActivity派生的类,将不能实现 IActivityEventListener 接口.或不能被正确执行

 

 

ParallelActivity

System.Workflow.Activities.ParallelActivity

 

并行容器,使用SequenceActivity作为分支容器,当所有分支中的结点都执行完成后,该ParallelActivity结点才结束,继续向下执行.其特点如下:

1.当所有分支中的结点都执行完成后,该ParallelActivity结点才结束

2.每分支容器SequenceActivity不是在一个独立的线程上运行的,而是在同一线程中作为一个独立的任务队列运行,特点如下:

每个分支容器SequenceActivity作为ParallelActivity的一个任务队列

SequenceActivity分支容器中的Activity作为任务队列中的每个任务项

ParallelActivity以下图方式周期性的查看每个Sequence队列中的第一项,如果是可执行的Activity就执行,如果是不可执行的,(如Delay没到期或HardleExternalEvent没被外部触发)就跳过

如果有挂起结点,将是工作流被挂起.

EventDrivenActivity

一个容器,该容器内的第一个结点必需是可以进入idle状态的结点,如Delay或HandExternalEvent

1.状态机结点

2.在ListenActivity中作为分支容器

 

System.Workflow.Activities

Wraps an Activity whose execution is initialized by an event. This class cannot be inherited.

包装一个 Activity 执行,执行一个事件对其初使化

 

 

The EventDrivenActivity is a CompositeActivity, meaning the EventDrivenActivity can contain other activities. The EventDrivenActivity is similar to the SequenceActivity activity, with some additional characteristics.

An EventDrivenActivity must have a parent that is either a ListenActivity, StateActivity, or StateMachineWorkflowActivity.

 

 EventDrivenActivity 是 CompositeActivity,表示EventDrivenActivity    能包含其他Avtivity,

他与SequenceActivity相似,很多额外的特征

EventDrivenActivity必需有一个ListenActivity, StateActivity, or StateMachineWorkflowActivity.作为父容器

 

The first child of an EventDrivenActivity activity must be an activity that inherits from IEventActivity. All subsequent children can be activities of any type. The IEventActivity blocks the pending occurrence of some events, such as starting a timer or the arrival of a message. When the event occurs, the IEventActivity finishes running, and then all subsequent activities are executed.

 

 EventDrivenActivity第一个子结点必需是一个继承 IEventActivity接口的Activity,

后面所有的结点可以是任意Activity。 IEventActivity 阻塞一些没解决的状态,如一个时间状态或一个外部消息的到来。当event完成,IeventActivity 完成运行,后面所有的Activity将执行

 

 

When the StateMachineWorkflow contains an EventDrivenActvity, the EventDrivenActivity has some restrictions. The EventDrivenActivity may contain one, and only one, activity of type IEventActivity, and the HandleExternalEventActivity must be the first child activity. (An HandleExternalEventActivity cannot be in the event handler for a child activity and cannot be a child to the EventDrivenActivity if the HandleExternalEventActivity is not the first child.) As long as the first activity is the HandleExternalEventActivity, the event handler can contain any activities. If an activity other than HandleExternalEventActivity is contained in EventDrivenActivity, that activity cannot have an event handler.

 

当状态机工作流包含一个EventDrivenActvity,这个EventDrivenActvity会有一些限制。

EventDrivenActivity  可以包含并且只能包含一个类开为 IEventActivity 的Activity.

并且 HandleExternalEventActivity 必须是第一个结点.(一个HandleExternalEventActivity不能被添加到

event handler里,不能被放入EventDrivenActivity 如果HandleExternalEventActivity 不是第一个结点)

 

只要HandleExternalEventActivity是第一个结点,event handler能包含任意Activity,如果一个activity other 那么HandleExternalEventActivity 包含在EventDrivenActivity 里的,that activity 不能有event handler

 

For example, an activity that supports event handling can be used inside the EventDrivenActivity but the activity cannot have event handlers attached to itself.

Another example is that the EventDrivenActivity can contain a ConditionedActivityGroup, but the ConditionedActivityGroup itself cannot contain any HandleExternalEventActivity classes.

 

例如:一个提供 event handling的Activity,可以放到EventDrivenActivity 里,但这个activity不能有event handlers绑定到他自身

SequenceActivity

System.Workflow.Activities

 

功能:

1.一个简单的的容器,容器里的结点按序顺执行

2.在中ParallelActivity中作为分支容器

说明:

1.SequenceActivity容器以排列好的方式依次运行容器内的子结点

2.当所有的子结点都完成时,SequenceActivity结点结束

3.SequenceActivity派生的类,将不能实现 IActivityEventListener 接口.或不能被正确执行

 

 

ParallelActivity

System.Workflow.Activities.ParallelActivity

 

并行容器,使用SequenceActivity作为分支容器,当所有分支中的结点都执行完成后,该ParallelActivity结点才结束,继续向下执行.其特点如下:

1.当所有分支中的结点都执行完成后,该ParallelActivity结点才结束

2.每分支容器SequenceActivity不是在一个独立的线程上运行的,而是在同一线程中作为一个独立的任务队列运行,特点如下:

每个分支容器SequenceActivity作为ParallelActivity的一个任务队列

SequenceActivity分支容器中的Activity作为任务队列中的每个任务项

ParallelActivity以下图方式周期性的查看每个Sequence队列中的第一项,如果是可执行的Activity就执行,如果是不可执行的,(Delay没到期或HardleExternalEvent没被外部触发)就跳过

如果有挂起结点,将是工作流被挂起.

 

ListenActivity

单线触发容器,使用EventDrivenActivity作为分支容器,当某条分支中的结点执行完成后,该ListenActivity结点就结束,继续向下执行,其他分支内的结点就不执行了

关于EventDrivenActivity容器的使用方法见EventDrivenActivity容器介绍

另外,其他分支中已执行部分的操作回滚的另附文章

 

SynchronizationScopeActivity

System.Workflow.ComponentModel

 

1.SynchronizationScopeActivity容器可设置一个互斥标记,有了互斥标记的SynchronizationScopeActivity容器相对另一个容器,是一个完整的执行单元,当一个容器没有完成时,其他有互斥标记的容器不会执行。

2.这时,具有同一互斥标记的容器,执行模式已经与ParallelActivity中描述有所不同,此时他们是串行的,下例中的等待时间变为所有Delay的累加,顺序也成了:A1,A2,A3,B1,B2,C1,C2

3.可以将多组分组字符加入SynchronizationHandles属性,具有相同分组字符的SynchronizationScopeActivity不会同时执行

4.如果不设SynchronizationHandles属性,SynchronizationScopeActivity不起任何做用

 

 

Represents a section of workflow that requires controlled access to shared variables. If two or more instances of a SynchronizationScopeActivity access the same variables, then the execution of these activities is effectively serialized. This class cannot be inherited.

表示一个workflow部分,that 请求管理进入静态变量,如果多个实例of a SynchronizationScopeActivity 请求变量 ,当执行这些Activity时,是一个有效的连续

 

 

SynchronizationHandles属性

System.Collections.Generic.List<string> stringcollection1 = new System.Collections.Generic.List<string>();

System.Collections.Generic.List<string> stringcollection2 = new System.Collections.Generic.List<string>();

System.Collections.Generic.List<string> stringcollection3 = new System.Collections.Generic.List<string>();

           

stringcollection1.Add("wxwinter");

this.syn3.SynchronizationHandles = stringcollection1;

 

 stringcollection2.Add("wxwinter");

this.syn2.SynchronizationHandles = stringcollection2;

           

stringcollection3.Add("wxwinter");

this.syn1.SynchronizationHandles = stringcollection3;

 

可以将多组分组字符加入SynchronizationHandles属性,具有相同分组字符的SynchronizationScopeActivity不会同时执行

 

ConditionedActivityGroup

1.可以通过定义条件触发CAG组中的某个Activity

 

2.拖入CAG中的每各个Activity 都有一个When Condition ,

When Condition有两种方式,一种是CodeCondition 一种是RuleConditionReferences

当When Condition条件满足时,在CAG的每个轮询周期内,该Activity 会执行一次

Activity 的When Condition可以不设,这时,该Activity只在第一次轮询时被执行,以后的轮询都不会被执行了

3.CAG有一个Until condition 属性,条件成立时,该CAG就退出轮询,结点完成

CAG轮询每一次新轮询开始时,会查看Until condition ,如果条件成立就退出,完成结点

  CAG的Until condition 属性可以不设,这时只CAG轮询不到When Condition条件成立还成立的Activity时,才完成结点

ConditionedActivityGroup

1.可以通过定义条件触发CAG组中的某个Activity

 

2.拖入CAG中的每各个Activity 都有一个When Condition ,

When Condition有两种方式,一种是CodeCondition 一种是RuleConditionReferences

When Condition条件满足时,在CAG的每个轮询周期内,该Activity 会执行一次

Activity When Condition可以不设,这时,该Activity只在第一次轮询时被执行,以后的轮询都不会被执行了

4.在CAG的每个轮询周期内,只要有Activity的When Condition条件成立,该Activity就会被执行一次

  在下一个CAG轮询周期内,如果该Activity的When Condition条件成立还成立,仍会被执行,直到When Condition条件不成立

replicatorActivity

1.Replicator可以在运行时刻,建立某个Activity 的多组实例

2.Replicator容器,只能包含一个Activity。

CurrentChildData属性

通过设定CurrentChildData属性,决定在运行时刻Replicator 启动Activity的实例个数

ExecutionType属性

可以设置replicator容器中的Activity实例是串行还是并行

UntilCondition属性

默认的情况下,UntilCondition属性没设,这时所有Replicator容器中的Activity的实例执行完成后,Replicator结点完成。如果设置UntilCondition 属性,当UntilCondition条件满足刊,Replicator会取消或中断正在运行的所有实例,结束该结点

ChildInitialized事件

每次创建子Activity 实例时执行

  事件中有一个System.Workflow.Activities.ReplicatorChildEventArgs 对象,它是Replicator容器,将数据传递给每个子Activity 实例的通道

        void replicatorActivity1_ChildInitialized(object sender, ReplicatorChildEventArgs e)

        {

           子控件 obj = (子控件)e.Activity;

            obj.标记数据属性 = (string)e.InstanceData;

        }

e.Activity

代表当前子Activity 实例的引用,通过这个对象可以访问子Activity 中的属性

e.InstanceData

就是CurrentChildData 属性,它是IList对象

运行时刻每建立一个子Activity 的实例,就会从这个IList中取出一个对象作为该实例使用的数据

 

上例中的[标记数据属性]是子控件中定义的一个属性,使用这种方式将不同的参数传入每个子控件实例的内部

replicatorActivity会跟据CurrentChildData 属性中的项个数,自动建立与之对应个数的子控件实例,并把项依次分配给每个子控件实例

 

ChildCompleted 事件

每次子Activity 实例完成执行

       void replicatorActivity1_ChildCompleted(object sender, ReplicatorChildEventArgs e)

        {

            子控件 obj = (子控件)e.Activity;

            结果列表.Add(obj.投票数据.投票人 + obj.投票数据.结果 + obj.投票数据.投票时间);

 

        }

e.Activity

代表当前子Activity 实例的引用,通过这个对象可以访问子Activity 中的属性

e.InstanceData

对应ChildInitialized事件所分配的值

5.如果控制不好Activity的When Condition,与CAG的Until condition,可能会出现一个死循环

replicatorActivity

1.Replicator可以在运行时刻,建立某个Activity 的多组实例

2.Replicator容器,只能包含一个Activity

CurrentChildData属性

通过设定CurrentChildData属性,决定在运行时刻Replicator 启动Activity的实例个数

ExecutionType属性

可以设置replicator容器中的Activity实例是串行还是并行

UntilCondition属性

默认的情况下,UntilCondition属性没设,这时所有Replicator容器中的Activity的实例执行完成后,Replicator结点完成。如果设置UntilCondition 属性,当UntilCondition条件满足刊,Replicator会取消或中断正在运行的所有实例,结束该结点

 

 

 

 

 

posted @ 2010-12-19 14:44  左正  阅读(678)  评论(0编辑  收藏  举报