Workflow学习笔记 之Workflow HelloWord
2012-02-07 23:09 Shawn.Cheng 阅读(2085) 评论(8) 编辑 收藏 举报
一点闲话
年前的时候,到北京了一周,把工作定了下来。年后,初十的火车,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方法所在的类。我们可以看到如下代码
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