四虎精品视频-四虎精品成人免费网站-四虎黄色网-四虎国产视频-国产免费91-国产蜜臀97一区二区三区

一步一步學WF系列(一)——Hello world開始

  1. 什么是工作流

  我給工作流下了這樣的定義,工作流就是一個過程,這個過程會產生一定的結果。

其實,在OA系統中,審批流就是我們最常見的工作流之一。

  另外,簡單了說,其實我們所畫的流程圖就是一種最簡單的工作流,工作流最大的特點就是圖形化。工作流是按照順序驅動或者事件驅動去觸發下一步操作,從而最終得到一個結果。

  其實,我們也可以把他理解為一個過程化的職責鏈。

  2. 工作流的類型

  工作流大致分為兩類,順序工作流和事件驅動工作流。

  順序工作流是我們很常見的工作流,這個工作流是由我們事先規定好的順序一步步地走下去,他們執行的步驟是不可以改變的。

  事件驅動工作流,我們也稱之為有限狀態機,他狀態的變更是猶由于特定的事件而觸發的。

  舉例如下:

  順序工作流:審批流其實就是典型的順序工作流,一個審批對象一步步地層層審批,拿一次面試過程來說,首先人事部簡歷篩選,然后是技術經理面試,然后是總經理面試,這都是按照流程來的。

image

  事件驅動工作流:想想我們的軟件工程流程,是不是這樣的:

image

  3. 第一個實例:Hello world

  學任何程序,第一個例子往往都是Hello world,這次也不例外。

  讓我們先來構建一個簡單的WF小程序。

  我所使用的環境是Visual Studio 2008 + .NET Framework 3.5 sp1來搭建項目:

  首先讓我們來熟悉環境:

  打開VS2008,選擇新建——> 項目:

image

  然后選擇Workflow——>順序工作流控制臺應用程序。然后點擊確定就進入了我們的WF項目中。

image

  在項目中,我們可以看到Program.cs和Workflow1.cs。Workflow1我不多說,這個當然是我們的工作流程序。

  那來看一下Program.cs:

  4. 宿主

  Windows workflow foundation不是一個獨立的產品,他需要在一個宿主的環境下才能運行。

  這個宿主可以是控制臺應用程序,Winform程序,也可以是ASP.NET程序。

  WF的運行是通過工作流的運行時引擎來實現的。實際上,工作流運行時引擎和宿主的應用程序在同一進程中。

  5. 繼續Hello world

  在工具箱中,拖出一個Code控件。

image

  然后為codeActivity1起一個有意義的Name為codeActivityHello。

  然后去實現ExcuteCode事件,實現這個事件,運行庫將自動調用這個方法。

  實現如下:

private void codeActivityHello_ExecuteCode(object sender, EventArgs e)
{
Console.WriteLine("Hello world");
}

  好了,讓我們運行這段程序:

image

  6. 深入解析宿主文件

  讓我們進一步地去解析宿主文件Program.cs:

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();
};

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication3.Workflow1));
instance.Start();

waitHandle.WaitOne();
}
}

  WorkflowRuntime:為工作流執行引擎提供了可執行環境。

  接下來,workflowRuntime.WorkflowCompleted事件和workflowRuntimeTerminated分別指定了工作流執行結束和執行終止時所調用的匿名方法。

  接下來創造一個相應的工作流的實例,然后讓這個實例開始執行。

  而后去調用AutoResetEvent的實例waitHandle.WaitOne()作用在于阻止當前線程的執行,從而讓該工作流進行結束后,即WorkflowRuntime.WorkflowComplete事件技術后,我們再可以在這條語句后來調用執行其他的語句。

  沒什么好說的了,接下來去創建一個工作流的實例,然后開始執行。

  7. 讓程序更有趣一些

  分析過宿主文件之后,那我們開始讓程序更有趣一些。

  而手腳就讓我們從那兩個匿名方法開始。

  首先修改workflow1.cs 的 后臺代碼:

public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}

private string message;
public string Message
{
get { return message; }
}

private void codeActivityHello_ExecuteCode(object sender, EventArgs e)
{
this.message = "Hello world";
}
}

  當工作流執行的時候,他就給Workflow1類所實例化的對象中的Message屬性賦值為Hello world。我們需要做的是將這個Message獲取出來。

  先讓我們來看看本質,其實,在工作流的對象中,所有的屬性都是以鍵值對的形式存儲在哈希表中,因此,我們可以通過WorkflowCompleteEventArgs參數將對應的屬性得到,代碼如下:

string message = String.Empty;
workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {
message = e.OutputParameters["Message"].ToString();
waitHandle.Set();
};

  接下來,我們就可以打印出message了。

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication3.Workflow1));
instance.Start();

waitHandle.WaitOne();
Console.WriteLine(message);

image

  8. 進一步改造程序

  既然我們可以獲得參數,當然也可以向工作流中傳入參數。

  讓我們先來改造一下workflow1.cs的后臺代碼文件:

public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
}

private string message;
public string Message
{
get { return message; }
}

private string input;
public string Input
{
set { input = value; }
}

private void codeActivityHello_ExecuteCode(object sender, EventArgs e)
{
this.message = "Hello " + input;
}
}

  向工作流中傳入參數其實很簡單,讓我們來注意一下這個方法:

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

 

  這個方法通過傳入一個類型來實例化一個對應的工作流實例,當然,我們就是運用這個方法的重載方法去傳入對應的實例:

Console.WriteLine("Please input your name:");
string input = Console.ReadLine();
Dictionary<string, object> dic = new Dictionary<string, object>();
dic.Add("Input", input);

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication3.Workflow1),dic);
instance.Start();

waitHandle.WaitOne();
Console.WriteLine(message);

  看看效果:

image

  9. 總結

  以上是工作流的最簡單的一個例子,敬請關注下文。

NET技術一步一步學WF系列(一)&amp;mdash;&amp;mdash;Hello world開始,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 混凝土结构施工质量验收规范gb50204-2015| 远景山谷1981美国电影在线观看| 阮虔芷个人资料| 美国伦理女兵1| 永远的乳房 电影| 黄子华最新电影| 我不再什么作文500字| 意大利诱惑| 《卜算子》全文加拼音| 张静初三体电影| 甄嬛传演员表| 网络查控申请书| 男人干女人的视频| 拼音表| 哥谭骑士| 心跳源计划演员表| 《宝莲灯》| 希崎| 汪始慧| 遇见恶魔| 二哈和他的白猫师尊车子图片| 澳门风云3演员表| 数码宝贝第三部| 零下100度| 抚养费标准一般是多少钱一个月 | 情人看刀| 黄网站在线免费看| cf脚本| 李轻扬| 非常完美 电影| 国内自拍99| 惊涛| 老友记| 古铜| 等着我主持人| 噜啊噜在线视频| 黄造时曹查理隔世情电影| 柏欣彤广场舞| 电车之狼| 根深蒂固韩国电影| 你们可知道简谱|