• WF4.0 基础篇 (九) 控制流Activity


    本节主要介绍Parallel,Pick,PickBranch,ParallelForEach<T> 的使用.

     

    本文例子下载:

    https://files.cnblogs.com/foundation/controlActivitySample2.rar

    本文例子说明

    控制流Activity

    Parallel 并行容器

    类名

    System.Activities.Statements.Parallel

    文件

    System.Activities.dll

    结构说明

    继承 NativeActivity

    是一个 sealed类

    override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel 方法]

    [CompletionCondition]属性的类型为[ Activity<bool> ],可以接受一个结果为[bool]的表达式

    [Branches] 属性 的类型为[Collection<Activity>],是并行分支集合

    [Variables] 属性 的类型为[Collection<Variable>]

    功能说明

    [Parallel]中可以定义变量

    [Parallel]会并行执行[Branches] 集合内的所有Activity

    当[ CompletionCondition 属性]为真时,并行容器完成,其他没的执行完成的分支就不再执行了(包括执行一半的分支)

     

    例:基本使用

    1.在流程中添加[WriteLine]打印当前时间

    2.添加[Parallel],并添加两个分支

    第一个分支添加[Delay]延时 10秒, 添加[WriteLine]打印当"A"

    第二个分支添加[Delay]延时 15秒, 添加[WriteLine]打印当"B"

    3.在流程中添加[WriteLine]打印当前时间

     

    预期:两次的系统时间差为15秒表示为并行, 两次的系统时间差为25秒表示为串行

     

    流程

    宿主

     

    WorkflowInvoker.Invoke(new ParallelWorkflow());

    结果

     

    例:CompletionCondition 说明

    1.在流程中添加bool 型变量[myVariable],默认值False

    2.添加[Parallel],并添加三个分支

    第一个分支: 添加[WriteLine]打印当"A1" ;添加[Delay]延时 10秒;添加[WriteLine]打印当"A2"

    第二个分支: 添加[WriteLine]打印当"B1" ;添加[Delay]延时 15秒;添加[WriteLine]打印当"B2" ; 添加[Assign]为变量[myVariable]赋值True

    第三个分支: 添加[WriteLine]打印当"C1" ;添加[Delay]延时 20秒;添加[WriteLine]打印当"C2"

     

    预期: [Assign]为变量[myVariable]赋值True后,容器结束,因此会依次看到[A1,B1,C1,A2,B2],但看不到[C2]

     

    流程

    宿主

     

    WorkflowInvoker.Invoke(new ParallelCompletionConditionWorkflow());

    结果

     

    Pick,PickBranch 触发容器

    Pick

    类名

    System.Activities.Statements.Pick

    文件

    System.Activities.dll

    结构说明

    继承 NativeActivity

    是一个 sealed类

    override 了 [CacheMetadata方法] 与 [Execute方法] 与[Cancel 方法]

    override 了 [CanInduceIdle]属性

    [Branches ] 属性 的类型为[ Collection<PickBranch> ]

    PickBranch

    类名

    System.Activities.Statements. PickBranch

    文件

    System.Activities.dll

    结构说明

    继承 Object

    是一个 sealed类

    [Action]属性 的类型为[Activity]

    [DisplayName] 属性 的类型为[string]

    [Trigger] 属性 的类型为[Activity]

    [Variables] 属性 的类型为[Collection<Variable>]

     

    功能说明

    1. [Pick]触发容器,提供了基于事件的控制流。 [Branches]集合是触发容器的分支集合,只能添加[PickBranch]

    2. [Pick]触发容器中可以定义变量

    3. [PickBranch] 只可添加到[Pick]中,[PickBranch.Trigger]只能放入触发类Activity,[PickBranch.Action] 当[PickBranch.Trigger] 被触发时,所要执行的Activity

    4.只要有一个[PickBranch][Trigger]被触发,其他[PickBranch]就不会被触发了

    5.即使在被执行的[PickBranch]还没完成时,其他[PickBranch]也不会被触发

     

     

    例:基本使用

    1.在工作流中添加[WriteLine],打印系统时间

    2.在工作流中添加[Pick],添加三个[PickBranch]

    第一个分支: [Trigger]添加[Delay]延时 15秒

    [Action]添加[WriteLine]打印当"A"

    第二个分支: [Trigger]添加[Delay]延时 10秒

    [Action]添加[WriteLine]打印当"B1"

    添加[Delay]延时 15秒

    添加[WriteLine]打印当"B2"

    第三个分支: [Trigger]添加[Delay]延时 20秒

    [Action]添加[WriteLine]打印当"C"

     

    预期:只有第二个分支会被执行

     

    流程

    宿主

     

    WorkflowInvoker.Invoke(new PickWorkflow());

    结果

     

     

    ParallelForEach<T> 循环

    类名

    System.Activities.Statements.ParallelForEach<T>

    文件

    System.Activities.dll

    结构说明

    继承 NativeActivity

    是一个 sealed类

    override 了 [CacheMetadata方法] 与 [Execute方法]

    [CompletionCondition]属性的类型为[ Activity<bool> ],可以接受一个结果为[bool]的表达式

    [Body] 属性 的类型为[ActivityAction<T>]

    [Values] 属性 的类型为[ InArgument<IEnumerable<T>> ]

    功能说明

    [Values] 属性为要循环的集合

    [TypeArgument] 为要循环集合的的类型

    [item]为循环时的临时变量,可在[Body]中被访问

    每个迭代完成后,检查[ CompletionCondition 属性],为真时,完成

     

    例:基本使用

    1. 创建一code activity 名为[CollectionActivity],

    具有[Out]参数,类型为List<string>的参数[myOutCollection]

    2. 在流程中添加List<string>变量[myCollection]

    3. 在流程中添加[CollectionActivity],将[CollectionActivity.myOutCollection]参数绑定到 [myCollection] 变量

    4. 在流程中添加[ForEach<T>],[TypeArgument]属性指定[string]

    [Values] 属性绑定到 [myCollection] 变量

    在[Body]中添加[writeLine],打印[item]

     

    CollectionActivity

    public sealed class CollectionActivity : CodeActivity

    {

    public OutArgument<System.Collections.Generic.List<string>> myOutCollection { get; set; }

    protected override void Execute(CodeActivityContext context)

    {

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

    list.Add("wxd");

    list.Add("lzm");

    list.Add("wxwinter");

     

    context.SetValue (this.myOutCollection,list );

    }

    }

    流程

    宿主

     

    WorkflowInvoker.Invoke(new ParallelForEachWorkflow());

    结果

     

     

     

     

  • 相关阅读:
    嵌入式MicroFlighter 之STM32F103学习——编写第一个STM32程序
    嵌入式stm32学习方法
    嵌入式stm32学习之路(led流水灯工程)
    嵌入式stm32 LED 流水灯剖析(库函数版)
    Swift快速入门(一)第一个Swift程序
    从库函数方向入门stm32的个人建议
    嵌入式STM32使用PWM控制LED呼吸灯效果
    嵌入式STM32学习笔记之按键查询方式控制led灯的亮灭
    从零写一个编译器(完结):总结和系列索引
    从零写一个编译器(十三):代码生成之遍历AST
  • 原文地址:https://www.cnblogs.com/foundation/p/1613794.html
Copyright © 2020-2023  润新知