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()方法。

  • 相关阅读:
    字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD
    Context Application 使用总结 MD
    RxJava RxPermissions 动态权限 简介 原理 案例 MD
    Luban 鲁班 图片压缩 MD
    FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD
    组件化 得到 DDComponent JIMU 模块 插件 MD
    gradlew 命令行 build 调试 构建错误 Manifest merger failed MD
    protobuf Protocol Buffers 简介 案例 MD
    ORM数据库框架 SQLite 常用数据库框架比较 MD
    [工具配置]requirejs 多页面,多入口js文件打包总结
  • 原文地址:https://www.cnblogs.com/kissdodog/p/3988044.html
Copyright © 2011-2022 走看看