您的位置:首页 > 其它

Workflow学习笔记 之Workflow HelloWord

2012-02-07 23:09 471 查看
一点闲话

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

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

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

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

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

新建一个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方法所在的类。我们可以看到如下代码

namespace WorkflowConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())

{

AutoResetEvent waitHandle = new AutoResetEvent(false);

//工作流正常结束时,将要调用的方法

//发出信号,告知工作流已经运行结束

workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) { waitHandle.Set(); };

//工作流异常结束时将要调用的方法

workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)

{

Console.WriteLine(e.Exception.Message);

waitHandle.Set();//发出信号,告知工作流已经运行结束

};

//由workflowruntime创建workflow实例

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow1));

instance.Start();//启动实例,运行工作流

//由于工作流和当前的控制台并不在同一个线程中,所有要使用autoresetevent的通知机制,

//以防止控制台结束时,工作流还没有完成。

waitHandle.WaitOne();

}

}

}

}


暂时不需要做更改。

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

namespace WorkflowConsoleApplication1

{

public partial class Workflow2 : SequentialWorkflowActivity

{

private void codeActivity1_ExecuteCode(object sender, EventArgs e)

{

Console.WriteLine("Hello word!");

}

}

}


修改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文件。在里边输入如下代码。

<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">

<CodeActivity x:Name="codeActivity1">

</CodeActivity>

</SequentialWorkflowActivity>


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

<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">

<CodeActivity x:Name="codeActivity1" ExecuteCode="SayHello">

<x:Code>

<![CDATA[

private void SayHello(object sender,EventArgs e)

{

Console.WriteLine("hello workflow!");

}

]]>

</x:Code>

</CodeActivity>

</SequentialWorkflowActivity>


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

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

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

namespace EmptyWorkflow

{

class Program

{

static void Main(string[] args)

{

using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())

{

AutoResetEvent resetEvent = new AutoResetEvent(false);

workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e)

{

Console.WriteLine("工作流执行完毕!");

resetEvent.Set();//发出完成信号

};

workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)

{

Console.WriteLine(e.Exception.Message);

resetEvent.Set();

};

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(EmptyWorkflow.Workflow));

instance.Start();//启动工作流,按照xoml中的配置进行代码的执行

resetEvent.WaitOne();

}

}

}

}


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



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

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

/article/4694746.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: