程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 工作流編程循序漸進(2:IfElseActivity活動)

工作流編程循序漸進(2:IfElseActivity活動)

編輯:關於C#

一、引言本文中,我們來學習另一個簡單活動--IfElseActivity。關於此活動,首先需要說明一下:

借助於IfElseActivity活動,你可以創建工作流中的分支結構,每一個分支對應於一個IfElseBranehActivity分支。

IfElseActivitv活動可以有條件地選擇執行多個IfElseBranchActivity分支中的一個。也就是說,對每個IfElseBranchActivity活動的執行,都必須被一個條件所激發。

對於IfElseBranchActivity活動的執行條件,如果該條件的計算結果為True,則會執行該IfElseBranchActivity活動中所包含的其他活動;如果計算結果為False,則會對一個IfElseBranehActivity條件進行計算,依此類推。

IfElseActivity活動的最後一個IfElseBranchActivity活動分支,會被視為Else分支,該分支不需要任何條件來進行激發。

可通過IfElseBranchActivity活動的Condition屬性,來為該活動設置條件,共有“代碼條件“和“聲明性規則條件”兩個選項。

你可以使用條件來控制工作流的行為。工作流引擎會判斷條件,並依據判斷的結果來決定之後的行為。在工作流中有兩種表達條件的方式:

你可以編寫一個處理方法並返回一個布爾值。

你可以在工作流中定義一個規則。

你可以在工作流的運行期間動態更新條件規則,來改變工作流的行為。

你也可以通過創建一個策略類型的活動,來使用條件行為。

條件規則只能是工作流類中定義任何公共成員——變量或者方法。而條件代碼可以是任何公共或私有的成員。

下面,我們來構建一個簡單的示例。

二、創建控制台順序工作流示例程序框架

請遵循如下步驟創建一個控制台順序工作流示例程序:

1.啟動VS2008,單擊菜單”文件“|”新建“|”項目“,創建一個名字為IfElseActivity的控制台順序工作流示例程序,見下圖。

2.之後,系統自動打開工作流設計器界面,如圖所示。

3.從工具箱中拖動IfElse活動到圖中右側的漢字提示處,得到如圖所示的情形。

4.顯然,IfElse活動默認情況下添加了兩個分支,這是最為常用和最簡單的情形。其實,你還可以添加另外的更多的分支,以模擬類似於高級語言中的多分支語句switch情形。方法是右單擊IfElse活動並選擇“添加分支”即可。

5.經過上面的操作後,你得到如下圖所示的工作流:

[提示]:你可以在單擊某個IfElseBranch活動後,通過選擇屬性窗口中的“左移”及“右移”選項調整此活動在圖中的位置。

6.根據前面文章中介紹的幾種簡單活動,我們不妨再添加幾個活動,得到如下圖所示形式:

我們的設想很簡單:出現一個提示讓用戶選擇自己的角色,根據角色的不同,執行不同的簡單活動。之後,通過一個Delay活動延遲3秒鐘,按任意鍵然後結束。

下面,我們來討論活動有關屬性設置及編碼問題。

三、活動有關屬性設置及編碼

1.單擊最左邊的IfElseBranch活動,在對應的屬性對話框中指定Condition為“代碼條件”,輸入條件方法名為Condition1,如圖所示:

然後,按下回車鍵,系統即自動跳轉到此方法代碼編輯處,輸入如下內容:

private void Condition1(object sender, ConditionalEventArgs e)
{
 if (rolename.ToUpper() == "A")
   e.Result = true;
 else
   e.Result = false;
}

類似地,設置中間IfElseBranch活動的觸發條件也為代碼條件,輸入條件方法名為Condition2,相關代碼為:

private void Condition2(object sender, ConditionalEventArgs e)
{
 if (rolename.ToUpper() == "C")
   e.Result = true;
 else
   e.Result = false;
}

因為我們的例子中僅有三個條件,所以,前兩種情況不滿足時,便執行最後一個活動。因此,不必為之指定觸發條件方法。

2.現在,依次設置上面圖中從左向右三個子條件中Code活動的ExecuteCode方法代碼如下:

private void admin_ExecuteCode(object sender, EventArgs e)
{
 Console.WriteLine("您好,管理員!");
}
private void codeActivity3_ExecuteCode(object sender, EventArgs e)
{
 Console.WriteLine("您好,客戶!");
}
private void passenger_ExecuteCode(object sender, EventArgs e)
{
 Console.WriteLine("您好,過客!");
}

3.設置codeActivity1活動的ExecuteCode方法代碼如下:

private void codeActivity1_ExecuteCode(object sender, EventArgs e)
{
 Console.WriteLine("請選擇您的角色:(C-普通客戶;A-系統管理員;P-過客)");
 rolename = Console.ReadLine();
}

4.設置最後面那個codeActivity2活動的ExecuteCode方法代碼如下:

private void codeActivity2_ExecuteCode(object sender, EventArgs e)
{
 Console.Read();
}

5.另外,設置Delay活動延遲3秒鐘非常簡單,不贅述。

至此,完成了整個工作流部分的設計工作。非常直觀簡單!最後,別忘記把上面文件保存一下。

最後,我們來看一下控制台主程序是如何創建工作流實例,並啟動工作流執行的。切換到控制台主程序Program.cs。此時,系統已經為我們自動生成了如下代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Workflow.Runtime;
using System.Workflow.Runtime.Hosting;
namespace CodeAndDelay
{
 class Program
 {
  static void Main(string[] args)
  {
   //......經常在此添加一些初始化代碼
   //創建工作流實例,並啟動工作流執行。注意:工作流是以異步的獨立的工作線程方式執行的
   using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
   {
   utoResetEvent 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();
   };
   WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(CodeAndDelay.Workflow1));
   instance.Start();
   waitHandle.WaitOne();
   }
   //......在此經常執行一些工作流執行後的善後工作
  }
 }
}

注意:有關上面代碼中AutoResetEvent事件等的詳細討論將在後續文章中介紹。

四、運行實例

按F5運行控制台程序,一般順利的話,將得到如下圖所示運行時快照。

第一個界面:

接下字母a,並按下回車鍵,得到下圖:

無他復雜設計,不再贅述。

五、小結

在本文中我們學習了IfElseActivity活動的使用過程,在下一篇中將學習另外幾個基本活動--While活動,ConditionalActivityGroup活動,Replicator活動等待。

出處: http://zhuxianzhong.blog.51cto.com/157061/203302

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved