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

 

 

本文的两个例子

 

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

 

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


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


流程实例WorkflowApplication

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

image.png

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

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对象,创建一个工作流的实例

 

102809_1053_WF402.png

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

Action<WorkflowApplicationCompletedEventArgs> Completed { getset; }

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

 

委托参数WorkflowApplicationCompletedEventArgs:

ActivityInstanceState CompletionState

IDictionary<stringobject> 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);

}

}

image.png

 

设计WF程序的基本原则

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

image.png

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

 

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

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

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

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

image.png

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

 

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

image.png

添加[System.Activities]类的引用

image.png

添加一个名为[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();

}

image.png

 

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

image.png


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

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

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

image.png


设计一个如下流程

image.png

得到流程的xaml字串

image.png


第三步:运行流程

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

image.png

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

image.png


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);

}

}

image.png

 

勇哥的学习笔记:

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


(知识点1) 使用WorkflowApplication来运行流程。

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

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

    class Program
    {
        static void Main(string[] args)
        {
            //在实际应用中,并不使用WorkflowInvoker.Invoke方式创建工作流
            //Activity workflow1 = new Workflow1();
            //WorkflowInvoker.Invoke(workflow1);

            //实际上一般使用WorkflowApplication运行工作流
            WorkflowApplication instance = new WorkflowApplication(new Workflow1());
            instance.Completed = new Action<WorkflowApplicationCompletedEventArgs>(workflowCompleted);
            Console.WriteLine(instance.Id);
            instance.Run();
            Console.ReadKey();
        }

        static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
        {
            Console.WriteLine("状态:{0}", e.CompletionState.ToString());
            Console.WriteLine("实例编号:{0}", e.InstanceId);
        }
    }
}

image.png


(知识点2)执行xmal格式的工作流,可以让用户去修改流程的执行,获得灵活性。

xmal格式的工作流,勇哥试了一下,除了教程中所说的创建一个image.png外,其实根本不用创建一个新项目,而是可以新建一个

image.png,创建一个WriteLine活动,查看它的代码,复制出来就可以了。

但是使用vs2013创建的工作流,其xmal代码跟教程上都到的仅仅只有三行不同,它好大一堆,如下:

<Activity mc:Ignorable="sap sap2010 sads" x:Class="wxwinterWorkflow.Activity1" sap2010:ExpressionActivityEditor.ExpressionActivityEditor="C#"
 xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"
 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 xmlns:sads="http://schemas.microsoft.com/netfx/2010/xaml/activities/debugger"
 xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation"
 xmlns:sap2010="http://schemas.microsoft.com/netfx/2010/xaml/activities/presentation"
 xmlns:sco="clr-namespace:System.Collections.ObjectModel;assembly=mscorlib"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <TextExpression.NamespacesForImplementation>
    <sco:Collection x:TypeArguments="x:String">
      <x:String>System</x:String>
      <x:String>System.Collections.Generic</x:String>
      <x:String>System.Data</x:String>
      <x:String>System.Linq</x:String>
      <x:String>System.Text</x:String>
    </sco:Collection>
  </TextExpression.NamespacesForImplementation>
  <TextExpression.ReferencesForImplementation>
    <sco:Collection x:TypeArguments="AssemblyReference">
      <AssemblyReference>Microsoft.CSharp</AssemblyReference>
      <AssemblyReference>System</AssemblyReference>
      <AssemblyReference>System.Activities</AssemblyReference>
      <AssemblyReference>System.Core</AssemblyReference>
      <AssemblyReference>System.Data</AssemblyReference>
      <AssemblyReference>System.Runtime.Serialization</AssemblyReference>
      <AssemblyReference>System.ServiceModel</AssemblyReference>
      <AssemblyReference>System.ServiceModel.Activities</AssemblyReference>
      <AssemblyReference>System.Xaml</AssemblyReference>
      <AssemblyReference>System.Xml</AssemblyReference>
      <AssemblyReference>System.Xml.Linq</AssemblyReference>
      <AssemblyReference>mscorlib</AssemblyReference>
      <AssemblyReference>wxwinterWorkflow</AssemblyReference>
    </sco:Collection>
  </TextExpression.ReferencesForImplementation>
  <WriteLine Text="www.skcircle.com" sap2010:WorkflowViewState.IdRef="WriteLine_1" sads:DebugSymbol.Symbol="d5cBQzpcVXNlcnNcQWRtaW5pc3RyYXRvci5QQzgtMjAxOTEwMDdMUllcRGVza3RvcFxmd+a1i+ivlVzmtYHnqIvlrp7kvotXb3JrZmxvd0FwcGxpY2F0aW9u5LiO6K6+6K6hV0bnqIvluo/nmoTln7rmnKzljp/liJlcd3h3aW50ZXJXb3JrZmxvd1xBY3Rpdml0eTEueGFtbAIjAyOJAQIBASMTIyUCAQI=" />
  <sap2010:WorkflowViewState.IdRef>wxwinterWorkflow.Activity1_1</sap2010:WorkflowViewState.IdRef>
  <sap2010:WorkflowViewState.ViewStateManager>
    <sap2010:ViewStateManager>
      <sap2010:ViewStateData Id="WriteLine_1" sap:VirtualizedContainerService.HintSize="214.4,62.4" />
      <sap2010:ViewStateData Id="wxwinterWorkflow.Activity1_1" sap:VirtualizedContainerService.HintSize="254.4,142.4" />
    </sap2010:ViewStateManager>
  </sap2010:WorkflowViewState.ViewStateManager>
</Activity>


不过也没关系,整个复制到下面的WPF的textbox里面,运行一下,仍然可以看到效果。

下图中,显示了人工改动之后再次run的运行效果。(前后加了--)

image.png

注意:

在wpf中的textbox文本框,默认设置是无法粘贴多行内容进去的。解决办法是设置AcceptsReturn="True",让它可接收回车换行。

请参考下面的参数:

<TextBox
  Name="tbMultiLine"
  TextWrapping="Wrap"
  AcceptsReturn="True"
  VerticalScrollBarVisibility="Visible"
>



通过本节内容,勇哥学到了下面的知识点:


  • 通常用WorkflowApplication运行和管理流程

  • 用XML格式字符串创建流程


在开头第三篇贴子就看到了把workflow运用到自己项目中的办法,这也是之前勇哥的困惑哦。


#转载请注明出处 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