zoukankan      html  css  js  c++  java
  • Workflow学习笔记 之Workflow HelloWord

    一点闲话                                                                       

    年前的时候,到北京了一周,把工作定了下来。年后,初十的火车,11的清晨,天未明的时候来到京城。

    从此,开始了人生的一个新的阶段。

    Ok,最近要学习很多新的知识了。不仅仅是专业知识,还有职场,各个方面。

    接下来,我们谈一下workflow的helloword,我们的第一个工作流应用程序。将分别使用模版和纯手工编写两种方式实现。

    首先我们利用vs的模板,构建我们的hello word程序                                         

    1. 新建一个workflow的控制台应用程序

    如图所示(选择 Sequential Workflow Console Application)

    注意,我们这里使用的是.net3.5的Framework。如果使用4.0的,创建的是xaml的设计文件,虽说本质上二者没有差别,但是我对其还不太熟悉。而且接下来的Activity使用都是基于.net3.5的,暂时就先用。随后,我把4.0的搞清楚后,会补上。

    点击确定后,出现如下界面。

    双击workflow1.cs可以看到设计界面

    从右边的工具箱中,拖进一个condeacvity。

    可以看到有一个红色的感叹号,这是因为我们没有设置其ExecuteCode事件设置的。

    查看其属性,双击事件中的ExecuteCode框,

    可以像传统的事件生成模式一样,编译器为我们生成相应事件代码。

    在codeActivity1中填写代码

                  Console.WriteLine("hello word!");

    很好理解,表示工作流执行到CodeAcvity活动时,将会执行该函数。

    我们的工作流怎么运行起来呢?

    找到Program.cs文件,这是控制台应用程序main方法所在的类。我们可以看到如下代码

     

     1 namespace WorkflowConsoleApplication1
    2
    3 {
    4
    5 class Program
    6
    7 {
    8
    9 static void Main(string[] args)
    10
    11 {
    12
    13 using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
    14
    15 {
    16
    17 AutoResetEvent waitHandle = new AutoResetEvent(false);
    18
    19 //工作流正常结束时,将要调用的方法
    20
    21 //发出信号,告知工作流已经运行结束
    22
    23 workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { waitHandle.Set(); };
    24
    25 //工作流异常结束时将要调用的方法
    26
    27 workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
    28
    29 {
    30
    31 Console.WriteLine(e.Exception.Message);
    32
    33 waitHandle.Set();//发出信号,告知工作流已经运行结束
    34
    35 };
    36
    37
    38
    39 //由workflowruntime创建workflow实例
    40
    41 WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow1));
    42
    43 instance.Start();//启动实例,运行工作流
    44
    45 //由于工作流和当前的控制台并不在同一个线程中,所有要使用autoresetevent的通知机制,
    46
    47 //以防止控制台结束时,工作流还没有完成。
    48
    49 waitHandle.WaitOne();
    50
    51 }
    52
    53 }
    54
    55 }
    56
    57 }



     

    暂时不需要做更改。

    instance.Start();方法将会执行我们设计器中设计的工作流,从上而下执行。

    运行,我们的hello word 正常运行。

     

     

     

     

    可以看到我们的工作流workflow分为了两部分,一个是workflow.cs,一个是workflow.designer.cs。或许你已经明白,designer.cs是由编译器维护的,正是他,为我们完成了可视化的视图。我们只需要在前者中写我们所关注的代码即可。同样的,我们也可以采用另一种方式,效果是一样的。

    添加一个sequential work flow (with code separation),文件的后缀将是xoml形式的。该文件也分为,workflow2.xoml,和workflow2.xoml.cs ,前者也是维护了可视化图形的代码。

     

    我们同样的向工作流中拖入codeActivity,为其设置codeActivity1_ExecuteCode

     1 namespace WorkflowConsoleApplication1
    2
    3 {
    4
    5 public partial class Workflow2 : SequentialWorkflowActivity
    6
    7 {
    8
    9 private void codeActivity1_ExecuteCode(object sender, EventArgs e)
    10
    11 {
    12
    13 Console.WriteLine("Hello word!");
    14
    15 }
    16
    17 }
    18
    19 }



    修改Program.cs中WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow1));为

    WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow2));//构建workflow2实例。

     

     

    运行亦可。

     纯手工的helloword                                                   

    接下来,我们全部使用完全代码编写的形式完成helloword。

    新建一个空的工作流Project

     

    点击确定,修改项目属性为控制台项目。

     

     

    为项目添加Program.cs,workflow.xoml文件。

     

     

    使用xml编辑打开Workflow.xoml文件。在里边输入如下代码。

    1 <SequentialWorkflowActivity x:Class="EmptyWorkflow.Workflow" x:Name="Workflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
    2
    3 <CodeActivity x:Name="codeActivity1">
    4
    5 </CodeActivity>
    6
    7 </SequentialWorkflowActivity>



    这样,我们就等同于向工作流中拖入了一个CodeActivity。当然我们还需要为其设置ExecuteCode属性(事件),修改为如下代码

     1 <SequentialWorkflowActivity x:Class="EmptyWorkflow.Workflow" x:Name="Workflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">
    2
    3 <CodeActivity x:Name="codeActivity1" ExecuteCode="SayHello">
    4
    5 <x:Code>
    6
    7 <![CDATA[
    8
    9 private void SayHello(object sender,EventArgs e)
    10
    11 {
    12
    13 Console.WriteLine("hello workflow!");
    14
    15 }
    16
    17 ]]>
    18
    19 </x:Code>
    20
    21 </CodeActivity>
    22
    23 </SequentialWorkflowActivity>



    ExecuteCode属性指明了将要执行的方法。

    Xoml 可以像aspx一样,使用内嵌代码的形式。我们将SayHello方法放在<x:code>标签中。然后,我们为项目添加Workflow.xoml.cs类文件,将其设为public,并使其继承自SequentialWorkflowActivity,并添加partial关键字

    这样的化,将会和xoml中的x:Class="EmptyWorkflow.Workflow"指定的名词生成同一个类。这样我们就完成了工作流的主体。然后,我们向program中添加main方法。

     1 namespace EmptyWorkflow
    2
    3 {
    4
    5 class Program
    6
    7 {
    8
    9 static void Main(string[] args)
    10
    11 {
    12
    13 using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
    14
    15 {
    16
    17 AutoResetEvent resetEvent = new AutoResetEvent(false);
    18
    19 workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e)
    20
    21 {
    22
    23 Console.WriteLine("工作流执行完毕!");
    24
    25 resetEvent.Set();//发出完成信号
    26
    27 };
    28
    29 workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
    30
    31 {
    32
    33 Console.WriteLine(e.Exception.Message);
    34
    35 resetEvent.Set();
    36
    37 };
    38
    39 WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(EmptyWorkflow.Workflow));
    40
    41 instance.Start();//启动工作流,按照xoml中的配置进行代码的执行
    42
    43 resetEvent.WaitOne();
    44
    45 }
    46
    47 }
    48
    49 }
    50
    51 }



    运行程序,可以看到应用程序正常运行。

     

    Ok,这样我们就完成了我们工作流的第一个helloword应用。

    另外大家也可以看看这个系列的文章,还是比较适合初学者的。

    http://www.cnblogs.com/xiaoshatian/archive/2008/03/18/818615.html

  • 相关阅读:
    Spring ApplicationContext 是如何被注入的
    Spring @Controller和@RestController的区别?
    怎样查看 spring IoC 容器有哪些 bean
    YYKit持续补丁 brave
    iOS如何实现多代理模式OC brave
    iOS 之获取IP地址 以及 判断个人热点是否开启 brave
    CGContext 和 CIContext brave
    android 调用微信QQ的其他应用打开列表中添加自己的应用,并且获取uri brave
    CGContext图形上下文详解 brave
    iOS scrollView如何居中缩放 brave
  • 原文地址:https://www.cnblogs.com/linecheng/p/2342062.html
Copyright © 2011-2022 走看看