• WF4.0 基础篇 (三) 流程实例WorkflowApplication与设计WF程序的基本原则


     

    通过本节,可以初步了解WF程序的特性,为以后的WF类应用开发提供一个初步的感性认识

     

    目录

    1    流程实例WorkflowApplication与设计WF程序的基本原则    1

    1.1    流程实例WorkflowApplication    1

    1.2    设计WF程序的基本原则    3

    1.2.1    第一步: 用WPF创建一个用于运行流程的宿主    4

    1.2.2    第二步:创建一个Xaml的工作流    5

    1.2.3    第三步:运行流程    6

    1.3 WF4.0与WF3.X 的运行环境对比说明(如果对WF3.X不熟悉可以忽略本节)    7

     

     

    本文的两个例子

     

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

     

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

    流程实例WorkflowApplication与设计WF程序的基本原则

    流程实例WorkflowApplication

    我在[开始使用WF4.0.]中创建一个"hello wxwinter"屏幕的输出的工作流的例子

     

    在这个例子中我们使用如下方式启动了该流程

    class Program

    {

    static void Main(string[] args)

    {

    WorkflowInvoker.Invoke(new Workflow1());

    }

    }

     

    在实际应用中,我并不使用WorkflowInvoker.Invoke方式创建工作流(WorkflowInvoker的功能我会在以后的文章中详细介绍),我会用WorkflowApplication创建工作流实例, WorkflowApplication用于跟踪和管理单个工作流实例,先看一下WorkflowApplication的结构:

     

    类名

    System.Activities.WorkflowApplication

    文件

    System.Activities.dll

    结构说明

    继承 WorkflowInstance

    是一个 sealed类

    功能说明

    通过从构造函数传入Activity对象,创建一个工作流的实例

     

     

    WorkflowApplication提供了很多管理实例的属性与方法,今天先介绍一下Completed属性

    Action<WorkflowApplicationCompletedEventArgs> Completed { get; set; }

    当工作流完成时,会调用该属性所指定的System.Action<T>委托

     

    委托参数WorkflowApplicationCompletedEventArgs:

    ActivityInstanceState CompletionState

    IDictionary<string, object> Outputs

    Exception TerminationException

    Guid InstanceId

    IEnumerable<T> GetInstanceExtensions<T>() where T :

     

    下面的代码使用WorkflowApplication方式运行流程

    class Program

    {

    static void Main(string[] args)

    {

    // WorkflowInvoker.Invoke(new Workflow1());

     

    //创建实例

    WorkflowApplication instance = new WorkflowApplication(new Workflow1());

     

    //当实例运行完成时调用的方法

    instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);

     

    //打印实例ID

    System.Console.WriteLine(instance.Id);

     

    //启动实例

    instance.Run();

     

    System.Console.Read();

    }

     

    static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)

    {

    System.Console.WriteLine("状态:{0}",e.CompletionState.ToString());

    System.Console.WriteLine("实例编号:{0}", e.InstanceId);

    }

    }

     

    设计WF程序的基本原则

    很多时候,初学者学习WF时都使用[Workflow Console Application]这个项目模板

     

    以至于学习了很久,许多Activity也使用的很熟练了,但就是无法理解WF究竟该怎样应用到实际项目中.

     

    其实[Workflow Console Application]这个项目模板仅仅是用于初学者练习的,WF有两种创建流程的方式:

    1.用类创建流程,[Workflow Console Application]这个项目模板就是这种方式

    2. 用XML格式字符串创建流程

    由于WF设计的目的就是灵活,所以用XML格式字符串创建流程的方式才能体现这一点,下面我就用一个例子来演示一下用XML格式字符串创建流程的方式,

     

     

     

     

     

     

     

    第一步: 用WPF创建一个用于运行流程的宿主

     

    建立一个[WFHost]的WFP项目,将解决方案命名为[LoadXamlSample]

     

    添加[System.Activities]类的引用

     

    添加一个名为[run]的文本框(AcceptsReturn="True"),添加一个名为[runButton]的按钮, 为[runButton]添加[Click]事件

    private void runButton_Click(object sender, RoutedEventArgs e)

    {

    System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding();

     

    byte[] bs = utf8.GetBytes(this.xamlTextBox.Text);

     

    System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(bs);

     

    Activity activity = ActivityXamlServices.Load(memoryStream);

     

    WorkflowApplication myInstance = new WorkflowApplication(activity);

     

    myInstance.Run();

    }

     

    为了能看到控制台输出,要将项目的输出类型设为[Console Application]

     

    第二步:创建一个Xaml的工作流

    用文本文件创建Xaml工作流是痛苦的工作,在没为大家讲解开发流程设计器之前,我们先用VS2010创建一个流程

    创建一个名为[wxwinterWorkflow]的[Activity Library]项目

     

    设计一个如下流程

     

    得到流程的xaml字串

     

    第三步:运行流程

    运行[WFHost]程序,将上步得到的xaml字符串粘贴到文本框中,点击[run]按钮,会在控制台看到"hello wxwinter"的输出

     

    将文本框中的<WriteLine Text="hello wxwiter" />改为<WriteLine Text="hello wxd" />,点击[run]按钮,会在控制台看到"hello wxd"的输出

     

    WF4.0与WF3.X 的运行环境对比说明(如果对WF3.X不熟悉可以忽略本节)

    WF3.X与WF4运行环境最明显的变化是,在WF3.X中要创建实例要使用WorkflowRuntimeCreateWorkflow方法.

    而在WF4中,不需要显示创建一个[WorkflowRuntime],而是直接使用[WorkflowInstance (bate1中)] 创建,这也是到了bate2中将[WorkflowInstance ]改名为[WorkflowApplication]的原因

    class Program

    {

    static void Main(string[] args)

    {

    WorkflowRuntime workflowRuntime = new WorkflowRuntime();

    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(wxwinterActivity));

    instance.Start();

    System.Console.Read();

    }

    }

    public class wxwinterActivity : System.Workflow.ComponentModel.Activity

    {

    protected override System.Workflow.ComponentModel.ActivityExecutionStatus Execute(System.Workflow.ComponentModel.ActivityExecutionContext executionContext)

    {

    System.Console.WriteLine("wxd");

    return base.Execute(executionContext);

    }

    }

     

     

  • 相关阅读:
    IIS6的http.ini伪静态规则转换为IIS7伪静态规则的方法
    php ecshop 二级域名切换跳转时session不同步,解决session无法共享同步导致无法登陆的问题
    ECSHOP登录自动退出问题解决
    aspcms 分享到微信显示找不到模版的解决办法!
    ASPCMS内容调用去掉html标签
    凡是出现了问题,都是有原因存在的。
    spring下载地址
    比较好的资源
    xp系统下,安装github时,需要下载的补丁
    联合更新语句,根据photo中的数量更新相册表Num列
  • 原文地址:https://www.cnblogs.com/foundation/p/1591616.html
Copyright © 2020-2023  润新知