zoukankan      html  css  js  c++  java
  • 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);

    }

    }

     

     

  • 相关阅读:
    Realtime crowdsourcing
    maven 常用插件汇总
    fctix
    sencha extjs4 command tools sdk
    首次吃了一颗带奶糖味的消炎药,不知道管用不
    spring mvc3 example
    ubuntu ati driver DO NOT INSTALL recommand driver
    yet another js editor on windows support extjs
    how to use springsource tools suite maven3 on command
    ocr service
  • 原文地址:https://www.cnblogs.com/foundation/p/1591616.html
Copyright © 2011-2022 走看看