一步一步教你實現乙個工作流執行時

2021-09-22 13:15:57 字數 4208 閱讀 9820

受到講述最新版workflow foundation的首先,讓我們複習一下底層的clr技術continuation。continuation能讓儲存恢復執行,因此,它需要包含可執行**的指標。委託用來實現這個目的。委託有乙個很大的優點,它能夠雙向地儲存和恢復二進位制檔案,儲存的檔案仍然可以繼續執行。下面**段顯示委託的雙程運作。(**見附件)

code sample 1: serializabledelegate

序列化委託提供了乙個機制,能讓我們暫停執行託管的執行緒,在另乙個程序中恢復(也許在另一台計算機)。這樣做有很多好處。其中最重要的是,我們移除了'親和力'。**不再附在原來的程序,甚至原來的機器。這樣允許我們通過簡單的新增的計算機來擴充套件應用程式。此外,我們現在有一些控制。例如,我們可以刪除序列化的委託,而不是恢復。這樣,我們是取消了執行。同樣,我們可以暫停幾天執行,而且不必擔心記憶體的使用。讓我們通過這個**示例,看看如何通過序列化的委託把乙個程式分成幾個程序完成。

code sample: version 1

執行這個程式三次,你將會在控制台上看見「hello world to homemade workflow foundation!」 輸出。上面的**已經為我們設計出第乙個最原始的工作流應用程式。不用說,這是非常的粗糙,有很多需要改進。首先,我第一步進行可擴張性地分離(事實上,現在我們是在業務邏輯中序列化委託的)。為了實現這個,我新增乙個名字為readreadwrite類。將業務邏輯移動到這個類裡面。這是我們的第二版:

version 2中,首先我在主程式裡面放置了乙個while迴圈這樣就不用去執行程式三次。這樣就比較方便。這是非常容易讓我們了解到將它們分解成不同的程式,但我們沒有這樣做。重構是最簡單的,但是在這裡有一點是值得注意的,在readreadwrite中使用了nextdelegate屬性,這是為了讓所有的委託能分享乙個統一的簽名。

現在宿主程式和業務邏輯是分開的。在這一點上,我們仍然有兩個宿主和業務邏輯之間的耦合。宿主需要知道是從runstep1開始的。宿主還需要知nextdelegate是儲存延續的屬性。這些耦合使得宿主不通用。我們可以消除這些耦合通過為readreadwrite定義乙個基類,我們稱它為activity。

重構很簡單。看下readreadwrite,現在這些**很容易寫了。有一點我們都不喜歡的,execute方法和runstep2方法都是讀取檔案的**,最好是將邏輯分享到可重用元件中。為了處理這個問題,實際上我們了解到存在兩個障礙。乙個是他們是更新不同states,以及返回不同的委託。它們返回不同的委託,事實上也是乙個問題。因為這些委託是真正的控制邏輯,都是讀取檔案。我們把他們放在一起,這樣邏輯就不連貫。現在,我們通過拆分結構,進一步優化他們。

寫sequence活動是不簡單的事情,現在離理想情況還很遠。我們將sequence的優化推遲到下節討論。現在我想側重於移除read1和read2之間的重複。對於上面的**,現在read1和read2其實只是讀檔案。最後一步,合併這兩個類,使它們通過名稱訪問states,而不是乙個靜態字段。

現在我們已經訪問這個用於編寫可重用的活動states 。這些活動不必擔心自己的序列化。如果沒有閱讀的main的**,甚至不知道序列化的發生。read或write,看是否像我們activity的api?在本系列的後面,我們將繼續這方面的例子,說明為什麼execute方法還有乙個的引數,以及如何從資料中分離出程式。

完全相同的觀點同樣適用於工作流。我們認為,sequence作為程式,而sequencecounter只是執行資料。sequencecounter被定義在sequence類中也使他們密不可分。考慮到多個工作流程會執行在相同的流程定義,sequencecounter就會混淆,造成一些問題。

閱讀一下activity的**, states被定義在工作流中其實是個很大的問題。我們無需將它定義成活動的保護屬性字段,而是可以從execute方法引數中檢索。同樣,我們也不應將nextdelegate定義在活動中。這樣會越來越複雜,因為sequence執行需要儲存兩個委託物件。為了解決這個問題,我們將使用stack持有這些物件。建議勤奮的讀者自己試驗一下,因為我們從這個版本到下乙個版本是乙個很大的飛躍(而不是小小的重構)如下所示。

我試圖保持從版本5到版本6盡可能小的修改。由於我們將委託儲存從activity移動到states中,我們還優化sequence的執行。現在,執行特定的活動將不會通過sequence,而只是將sequence的延續儲存在堆疊中。特別地,我們將會把更多的邏輯放在states中,使堆疊是由states維護,而不是由sequence和program分配。使frames為乙個私有字段,驅動所有一切。

版本7沒有結構性變化,只是堆疊封裝。

code sample: version 7

我們已經非常接近完成了。現在對於states物件序列化,我們應該完成的分離嗎?答案是no。這是因為states包含對委託的引用,然後委託將鏈結回該程式。為了打破這種聯絡,我們不能再序列化委託了。我們將序列化的methodinfo和活動,以及活動的id,活動的id可以通過活動樹的遍歷取得。我們將跳過這,因為這個使示例複雜了。另乙個問題是程式沒有被限定為唯讀。有多種解決問題的辦法。wf3選擇使用了程式的乙個副本,並始終執行這個副本,同樣wf4選擇使用程式的乙個副本和在執行時驗證主程式是不能修改的。當程式在執行時改變,我們可以使報錯給使用者。這樣又使示例複雜了,在這裡我們將停止這方面的討論。嘗試執行或閱讀怎麼去實現的是乙個很好的學習方法。

另乙個程式和資料大問題,是一行程式在乙個程序中可以在執行多次。最簡單的例子是乙個迴圈。這些資料被儲存在frame中而不是states。事實上,所有states應被儲存在乙個frame中。它又儲存states本身,使它為全域性變數。有了frame,我們可以控制的變數範圍。這是乙個相對上乙個版本wf的很大的進步。

看看states實現情況。其中乙個問題是scheduleactivity只能呼叫一次,在接下來的文章,我會談談提高scheduleactivity,允許它有多個未完成的活動和工作流程,以及通過書籤進行宿主通訊。

因為我們想保證安全,我們使用的是舊的活動,在上個示例中沒有並行的功能,現在我們將介紹並行,parallel是最簡單的開箱的activity ,這裡我將使用parallel排程兩個read。

注意儘管使用了parallel活動,工作還是順序執行。基本上並行活動允許有多個未完成的工作。當這些工作專案正在等待外部訊號,這些外部訊號都等待著所有的都結合在一起。我們用frame作為委託依賴,但有時委託沒有準備好執行不是因為控制依賴,而是資料依賴。這些資料最終來自宿主。來自states,我們可以發訊號給宿主等待這些資料,來自宿主,資料已準備就緒,這些依賴可能被打破。wf3通過workflowqueue提供了這樣的機制,wf4通過書籤實現這一點。程式實際上只是要求乙個專案時,queue有時顯得很過分。

這將是我們的home made wf系列的結束,當然我們還有很長的路要走。但我猜直至現在你應該可以欣賞wf帶給您什麼,以及如何最好地為您的應用程式服務。

示例**:/files/zhuqil/homemadewf.zip

一步一步教你配置vnc

配置 vnc遠端桌面連線 1.在命令列輸入 init 3 進入純字元介面 2.kill 掉所有與 x有關的程序 用命令ps aux grep x 然後kill 程序號1 程序號2 只要找到的程序都 kill 掉 如果不會使用 kill 命令,直接重啟電腦 3.首先檢查 vncserver 是否安裝使...

一步一步實現FormsAuthentic驗證登入

本文不講原理,只講用法,原理性的東西網上特別多,不過還是會對一些要用到的東西進行解釋,不深入講原理。本文中用的是vs2012 net mvc 4.0。原理看這篇文章 看完這個文章絕對受益匪淺。說下登入的整個流程 使用者輸入賬號密碼 點選提交 資料提交到後台控制器 去資料庫取得使用者資料 如果登入成功...

一步一步實現乙個簡單的OS HelloWorld

先弄個helloworld吧,雖然這個網上一大堆,不過不知道的人還是不少,就簡單的弄乙個吧。系統啟動時,第一步是bios自檢 這個不管 然後從cmos中設定的預設引導介質中載入第乙個扇區 512位元組 到記憶體的0x07c00處 0x0000 0x7c00 之後,跳轉執行。所以,引導啟動系統的第一部...