天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

一步一步學(xué)WF系列(一)——Hello world開(kāi)始

  1. 什么是工作流

  我給工作流下了這樣的定義,工作流就是一個(gè)過(guò)程,這個(gè)過(guò)程會(huì)產(chǎn)生一定的結(jié)果。

其實(shí),在OA系統(tǒng)中,審批流就是我們最常見(jiàn)的工作流之一。

  另外,簡(jiǎn)單了說(shuō),其實(shí)我們所畫(huà)的流程圖就是一種最簡(jiǎn)單的工作流,工作流最大的特點(diǎn)就是圖形化。工作流是按照順序驅(qū)動(dòng)或者事件驅(qū)動(dòng)去觸發(fā)下一步操作,從而最終得到一個(gè)結(jié)果。

  其實(shí),我們也可以把他理解為一個(gè)過(guò)程化的職責(zé)鏈。

  2. 工作流的類(lèi)型

  工作流大致分為兩類(lèi),順序工作流和事件驅(qū)動(dòng)工作流。

  順序工作流是我們很常見(jiàn)的工作流,這個(gè)工作流是由我們事先規(guī)定好的順序一步步地走下去,他們執(zhí)行的步驟是不可以改變的。

  事件驅(qū)動(dòng)工作流,我們也稱(chēng)之為有限狀態(tài)機(jī),他狀態(tài)的變更是猶由于特定的事件而觸發(fā)的。

  舉例如下:

  順序工作流:審批流其實(shí)就是典型的順序工作流,一個(gè)審批對(duì)象一步步地層層審批,拿一次面試過(guò)程來(lái)說(shuō),首先人事部簡(jiǎn)歷篩選,然后是技術(shù)經(jīng)理面試,然后是總經(jīng)理面試,這都是按照流程來(lái)的。

image

  事件驅(qū)動(dòng)工作流:想想我們的軟件工程流程,是不是這樣的:

image

  3. 第一個(gè)實(shí)例:Hello world

  學(xué)任何程序,第一個(gè)例子往往都是Hello world,這次也不例外。

  讓我們先來(lái)構(gòu)建一個(gè)簡(jiǎn)單的WF小程序。

  我所使用的環(huán)境是Visual Studio 2008 + .NET Framework 3.5 sp1來(lái)搭建項(xiàng)目:

  首先讓我們來(lái)熟悉環(huán)境:

  打開(kāi)VS2008,選擇新建——> 項(xiàng)目:

image

  然后選擇Workflow——>順序工作流控制臺(tái)應(yīng)用程序。然后點(diǎn)擊確定就進(jìn)入了我們的WF項(xiàng)目中。

image

  在項(xiàng)目中,我們可以看到Program.cs和Workflow1.cs。Workflow1我不多說(shuō),這個(gè)當(dāng)然是我們的工作流程序。

  那來(lái)看一下Program.cs:

  4. 宿主

  Windows workflow foundation不是一個(gè)獨(dú)立的產(chǎn)品,他需要在一個(gè)宿主的環(huán)境下才能運(yùn)行。

  這個(gè)宿主可以是控制臺(tái)應(yīng)用程序,Winform程序,也可以是ASP.NET程序。

  WF的運(yùn)行是通過(guò)工作流的運(yùn)行時(shí)引擎來(lái)實(shí)現(xiàn)的。實(shí)際上,工作流運(yùn)行時(shí)引擎和宿主的應(yīng)用程序在同一進(jìn)程中。

  5. 繼續(xù)Hello world

  在工具箱中,拖出一個(gè)Code控件。

image

  然后為codeActivity1起一個(gè)有意義的Name為codeActivityHello。

  然后去實(shí)現(xiàn)ExcuteCode事件,實(shí)現(xiàn)這個(gè)事件,運(yùn)行庫(kù)將自動(dòng)調(diào)用這個(gè)方法。

  實(shí)現(xiàn)如下:

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

  好了,讓我們運(yùn)行這段程序:

image

  6. 深入解析宿主文件

  讓我們進(jìn)一步地去解析宿主文件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:為工作流執(zhí)行引擎提供了可執(zhí)行環(huán)境。

  接下來(lái),workflowRuntime.WorkflowCompleted事件和workflowRuntimeTerminated分別指定了工作流執(zhí)行結(jié)束和執(zhí)行終止時(shí)所調(diào)用的匿名方法。

  接下來(lái)創(chuàng)造一個(gè)相應(yīng)的工作流的實(shí)例,然后讓這個(gè)實(shí)例開(kāi)始執(zhí)行。

  而后去調(diào)用AutoResetEvent的實(shí)例waitHandle.WaitOne()作用在于阻止當(dāng)前線(xiàn)程的執(zhí)行,從而讓該工作流進(jìn)行結(jié)束后,即WorkflowRuntime.WorkflowComplete事件技術(shù)后,我們?cè)倏梢栽谶@條語(yǔ)句后來(lái)調(diào)用執(zhí)行其他的語(yǔ)句。

  沒(méi)什么好說(shuō)的了,接下來(lái)去創(chuàng)建一個(gè)工作流的實(shí)例,然后開(kāi)始執(zhí)行。

  7. 讓程序更有趣一些

  分析過(guò)宿主文件之后,那我們開(kāi)始讓程序更有趣一些。

  而手腳就讓我們從那兩個(gè)匿名方法開(kāi)始。

  首先修改workflow1.cs 的 后臺(tái)代碼:

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

  當(dāng)工作流執(zhí)行的時(shí)候,他就給Workflow1類(lèi)所實(shí)例化的對(duì)象中的Message屬性賦值為Hello world。我們需要做的是將這個(gè)Message獲取出來(lái)。

  先讓我們來(lái)看看本質(zhì),其實(shí),在工作流的對(duì)象中,所有的屬性都是以鍵值對(duì)的形式存儲(chǔ)在哈希表中,因此,我們可以通過(guò)WorkflowCompleteEventArgs參數(shù)將對(duì)應(yīng)的屬性得到,代碼如下:

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

  接下來(lái),我們就可以打印出message了。

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

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

image

  8. 進(jìn)一步改造程序

  既然我們可以獲得參數(shù),當(dāng)然也可以向工作流中傳入?yún)?shù)。

  讓我們先來(lái)改造一下workflow1.cs的后臺(tái)代碼文件:

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

  向工作流中傳入?yún)?shù)其實(shí)很簡(jiǎn)單,讓我們來(lái)注意一下這個(gè)方法:

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

 

  這個(gè)方法通過(guò)傳入一個(gè)類(lèi)型來(lái)實(shí)例化一個(gè)對(duì)應(yīng)的工作流實(shí)例,當(dāng)然,我們就是運(yùn)用這個(gè)方法的重載方法去傳入對(duì)應(yīng)的實(shí)例:

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. 總結(jié)

  以上是工作流的最簡(jiǎn)單的一個(gè)例子,敬請(qǐng)關(guān)注下文。

NET技術(shù)一步一步學(xué)WF系列(一)&amp;mdash;&amp;mdash;Hello world開(kāi)始,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 99爱在线精品视频免费观看9 | 99视频在线看观免费 | 乱码AV午夜噜噜噜噜 | 亚洲国产五月综合网 | 午夜在线视频国产极品片 | 超碰免费视频公开97 | 邻家美姨在线观看全集免费 | 中文在线无码高潮潮喷在线 | 黄页网址大全免费观看 | 少妇两个奶头喷出奶水了怎么办 | 国产精品…在线观看 | 一扒二脱三插片在线观看 | 蜜桃狠狠色伊人亚洲综合网站 | 精品国内自产拍在线观看视频 | 免费视频网站嗯啊轻点 | 在线AV国产传媒18精品免费 | 99国产精品欲AV蜜桃臀麻豆 | 欧美特黄99久久毛片免费 | 亚洲国产日韩a精品乱码 | 校花爽好大快深点h | 近亲乱中文字幕 | 在线观看免费视频播放视频 | 热热久久这里只有精品 | 5G在线观看免费年龄确认 | 精品人伦一区二区三区潘金莲 | JEALOUSVUE成熟老师APP | 伊人亚洲AV久久无码精品 | 免费观看激烈日板子 | 老汉老太bbbbbxxxxx | 99久久精品免费看国产一区二区 | 97视频在线免费播放 | 人人模人人干 | 国产亚洲视频在线播放香蕉 | 花蝴蝶免费观看影视 | 97精品伊人久久大香线蕉app | 日本妈妈在线观看中文字幕 | 午夜国产高清精品一区免费 | 国产成人片视频一区二区青青 | 日本三级按摩推拿按摩 | 色欲精品久久人妻AV中文字幕 | 国产国产人免费观看在线视频 |