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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM