zoukankan      html  css  js  c++  java
  • 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<10)
      {
          Console.WriteLine("还小于10!");
          i++;
      }

      对应的流程图如下:

      

      需定义一个变量i。运行结果与上面代码一样。

      4、DoWhile

      DoWhile中可以定义变量,与C#语法中的dowhile一致。无论条件如何,至少执行一次。

      下面给出一个逻辑如下的示例:

        static void Main(string[] args)
        {
            int i = 0;
            do
            {
                Console.WriteLine("还小于10!");
                i++;
            }
            while (i < 10);
            Console.ReadKey();
        }

      如下:

      

      5、ForEach<T>

      Foreach<T>与C#语法里的foreach同义。

      下面的流程实现的逻辑如下:

        static void Main(string[] args)
        {
            int[] IntArr = new int[5] { 1, 2, 3, 4, 5 };
            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(只有最先开始的那条分支会被执行)

    1. Pick触发容器,提供了基于事件的控制流,Branches集合是触发容器的分支集合,只能添加PickBranch。
    2. PickBranch只可添加到Pick中,PickBranch.Trigger只能放入触发类Activity,PickBranch.Action当PickBranch.Trigger 被触发时,所要执行的Activity。
    3. Pick触发容器中可以定义变量。
    4. 只要有一个PickBranch的Trigger被触发,其他PickBranch就不会被触发了。
    5. 即使在被执行的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()方法。

  • 相关阅读:
    Perl 正则匹配经验记录
    Linux——高效玩转命令行
    推荐一个SAM文件或者bam文件中flag含义解释工具
    单端测序(Single- ead)和双端测序(Pai ed-end和Mate-pai )的关系
    区别samtools faid产生的.fai文件功能和bwa index 产生的四个文件的功能
    Perl新接触的小命令
    Perl调用外部命令(其他脚本、系统命令)的方法和区别
    Linux——命令
    学习《Python金融实战》中文版PDF+英文版PDF+源代码
    学习《深度学习与计算机视觉算法原理框架应用》《大数据架构详解从数据获取到深度学习》PDF代码
  • 原文地址:https://www.cnblogs.com/kissdodog/p/3988044.html
Copyright © 2011-2022 走看看