WF4.0 基础篇 (四) 顺序容器Sequence 与CodeActivity

本节主要介绍如何在WF4.0的流程中添加多个Activity,以及如何自定义Activity

 

本文例子下载:

http://files.cnblogs.com/foundation/SequenceSample.rar

http://files.cnblogs.com/foundation/CodeActivitySample.rar

 

目录

1    顺序容器Sequence 与CodeActivity    1

1.1    顺序容器Sequence    1

1.2 CodeActivity    2

 


顺序容器Sequence 与CodeActivity


顺序容器Sequence

image.png

类名

System.Activities.Statements.Sequence

文件

System.Activities.dll

结构说明

继承 NativeActivity

是一个 sealed类

定义了[Collection<Activity> Activities 属性] 与[Collection<Variable> Variables 属性]

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

功能说明

1.[Activities]集合,可以存放Activity

2.[Activities]集合中的Activity按顺序从上向下执行

3.[Variables]集合用于存放变最

 

image.png

在WF中,任意从Activity派生的类都可以实例化运行,如:


WriteLine myWorkfloe = new WriteLine() { Text = new InArgument<string>("wxxinter") };

WorkflowInvoker.Invoke(myWorkfloe);

image.png

 而用VS2010自带的模板所创建的流程是以[System.Activities.Activity]为根创建的,这时,在设计器中只能向设计容器中添加一个[活动],当然流程在很多时候是具有多个节点的,为了解决这个问题,我们可以向设计器中的[Activity 根]中添加一个顺序容器[Sequence],在顺序容器[Sequence]中,可以添加多个[活动], [活动]在流程运行时按其在顺序容器[Sequence]中的上下顺序依次执行.

image.png

执行结果

image.png


以下是用代码方式定义的流程

Sequence wxwinterWorkflow = new Sequence();

 

WriteLine writeLine1 = new WriteLine() { Text = new InArgument<string>("a") };

WriteLine writeLine2 = new WriteLine() { Text = new InArgument<string>("b") };

WriteLine writeLine3 = new WriteLine() { Text = new InArgument<string>("c") };

 

wxwinterWorkflow.Activities.Add(writeLine1);

wxwinterWorkflow.Activities.Add(writeLine2);

wxwinterWorkflow.Activities.Add(writeLine3);

 

WorkflowInvoker.Invoke(wxwinterWorkflow);

执行结果

image.png

 

 

CodeActivity

WF4.0 提供了许多Activity,但有时这些Activtiy并不能完成具体功能,如向数据库添加数据,发送电子邮件等.在实现这些具体功能时,我们仍要使用某种编程语言,如C#.当我们需要这种功能时,可以使用 CodeActivity

 

类名

System.Activities.CodeActivity

文件

System.Activities.dll

结构说明

继承 Activity

是一个 abstract 类

提供了[abstract void Execute(CodeActivityContext context)]方法

功能说明

一个抽向类,继承该类后,需要override该类的Execute方法,用于编写自定义的功能代码

 image.png

下面是一个CodeActivity的例子,实现了从控制台得到用户的输入,再打印输入结果的功能

 

1.创建一个名为[CodeActivitySample]的[Workflow Console Application] WF项目

image.png

2.为[CodeActivitySample]添加一个名为[myActivity]的[Code Activity]项

image.png

image.png


3. myActivity的代码内容如下

public sealed class myActivity : CodeActivity

{

protected override void Execute(CodeActivityContext context)

{

System.Console.Write("请输入内容:");

string inputString = System.Console.ReadLine();

 

string outputString = string.Format("你输入的是:{0}", inputString);

System.Console.WriteLine(outputString);

}

 

 

4.编译以后会在工具栏上看到[myActivity],将其添加到流程设计器中:

image.png

5.运行程序,结果如下

image.png




勇哥的学习笔记:

勇哥使用vs2013来实验上面教程的例子。


(知识点1) Sequence顺序容器。

从上到下顺序执行活动的容器。

image.png

使用代码方式使用Sequence顺序容器的方法,如下面代码:

using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;

namespace 顺序容器Sequence_与CodeActivity
{

    class Program
    {
        static void Main(string[] args)
        {
            Activity workflow1 = new Workflow1();
            WorkflowInvoker.Invoke(workflow1);

            //使用代码使用Sequence顺序容器的例子
            Sequence flow = new Sequence();
            WriteLine wline1 = new WriteLine() { Text = new InArgument<string>("a") };
            WriteLine wline2 = new WriteLine() { Text = new InArgument<string>("b") };
            WriteLine wline3 = new WriteLine() { Text = new InArgument<string>("c") };

            flow.Activities.Add(wline1);
            flow.Activities.Add(wline2);
            flow.Activities.Add(wline3);
            WorkflowInvoker.Invoke(flow);
            

            Console.ReadKey();
        }
    }
}

结果如上面教程所示,不再赘述。


(知识点2) CodeActivity  即代码活动,用于实现具体你要的功能。

添加一个现有的项目,选择image.png,添加了一个CodeActivity1.cs


image.png

这个类的默认内容由系统自动生成,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;

namespace 顺序容器Sequence_与CodeActivity
{

    public sealed class CodeActivity1 : CodeActivity
    {
        // 定义一个字符串类型的活动输入参数
        public InArgument<string> Text { get; set; }

        // 如果活动返回值,则从 CodeActivity<TResult>
        // 派生并从 Execute 方法返回该值。
        protected override void Execute(CodeActivityContext context)
        {
            // 获取 Text 输入参数的运行时值
            string text = context.GetValue(this.Text);
        }
    }
}

我们把Execute函数内容修改一下:

        protected override void Execute(CodeActivityContext context)
        {
            // 获取 Text 输入参数的运行时值
            //string text = context.GetValue(this.Text);
            Console.Write("请输入内容:");
            string inputString = System.Console.ReadLine();
            string outputString = string.Format("你输入的是:{0}", inputString);
            Console.WriteLine(outputString);
        }

然后编译一下程序,可以看到工具箱内出现myCodeActivity活动

image.png

把它放入Sequence顺序流容器内,运行后的结果如下图所示。

image.png


本篇勇哥学到如下的内容:


  • 顺序容器Sequence

  • CodeActivity


这个比较简单,显示得学习很顺利的样子,^_^



#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。
扫码加本站公众号

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«   2021年2月   »
1234567
891011121314
15161718192021
22232425262728
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:

Powered By Z-BlogPHP 1.6.0 Valyria

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864