[Develop]Lab10-StateMachine

[Develop]Lab10-StateMachine

Lab10 、 StateMachine

前些章節我們介紹了[ 循序流程 ] 的使用方式,但是在實務設計上,循序流程是個理想。我們比較常接觸到的流程比較屬於 [ 狀態
] 類型。舉個例

子來說,假如我們設計一個像 Pchome 這樣的購物網站 。當使用者一開始瀏覽網頁的時候,他可能選擇了特定的商品集合,例如他想要看
3C 產

品。然後我們要去連接資料庫,將3C產品的資訊撈出來給他看 ,撈出來的資料我們一般還會去分頁 。這個使用者可能看到喜歡的商品,會點選

商品進去看更詳細的描述。接著他可能跳出這項商品,也可能將商品加入購物車。接著他可能要去看看購物車裡面有那些東西了,或是想再去看

看其他商品,也有可能他就要去結帳了。前往到結帳的地方,他可能又想起還有一項東西要順便買,接著他又跳回商品瀏覽頁面了……。上述的

整個行為中,在分歧點出現了很多可能。決定要呈現什麼樣的網頁給使用這看決定於他的回饋,也就是所謂的 [ 狀態 ]。結帳本身也是一種流程,

他就比較適合 [ 循序式 ] 的流程設計。所以在 [ 狀態機流程 ] 中是可以包著一個 [ 循序流程的 ]。<– 聽起來很難懂。簡單的比喻,當設計購物網站

的時候。要去 "商品瀏覽網頁" 、"商品詳細敘述內頁"、"購物車內容瀏覽網頁"、"結帳網頁"、"會員登入網頁",要前去那一個網頁,就適合用狀態

來判斷。而去到那個網頁後,要開始一個流程,例如 "結帳流程"、"會員登入帳號密碼驗證流程"、"取消購物車裡面某項產品流程"….。就適合用

循序工作流程來設計。

接下來我們來初探狀態機的程式開發。


開啟一個新的WWF專案。

這個範例中我們要使用的是 [ 狀態機工作流程主控台應用程式 ] 。檔案名稱我們命名為 [ Lab10_StateMachine ] 。

clip_image001


認識狀態機器工作流程。

我們會看到中間的工作區是一個 [ 狀態機器工作流程 ],裡面有一個 [ Workflow1InitialState ],這是預設起始流程的狀態元件。在方案總管的部份

可以看到也是有一個 [ Workflow1 ] 的檔案。

clip_image002

clip_image003

在左邊工具箱裡面我們拉出四個 [ SetState ] 到工作區塊裡面來。在工作面板上看到的 StateActivity 裡面會有提示字,告訴你裡面要放置的元件可以有哪些!!

clip_image004

clip_image005

我們在新增的三個 [ StateActivity ]裡面個拉進一個 [eventDrivenActivity ] 元件。

clip_image006

然後照下圖的方式將每個 [eventDrivenActivity ] 拉一個連線到 下一個 [ stateActivity ]元件去,全部成逆時鐘連接起來。然後我們點選
[ Workflow1InitialState ]裡面的

[ eventDrivenActivity1 ]進去。 進去後你會看到 [ eventDrivenActivity1 ]右上角有一個紅色驚嘆號,點選它的時候他會
Show 出一段 Message。

[ 第一個 'eventDrivenActivity' 子系應實作 'System.Workflow.Activities.IEventActivity'
, 例如 'HandleExternalActivity' 或 'DelayActivity'。 ]。

clip_image007

clip_image008

接著在四個 [ StateActivity ] 裡面的[ eventDrivenActivity ] 都拉出項下列的元件,每個 [ eventDrivenActivity
] 第一個元件我們都用 [ delayActivity ]。

clip_image009clip_image010

clip_image011
clip_image012

每個 [ delayActivity ] 元件我們都在屬性的地方設定 [ TimeoutDrration ] 為五秒。這樣每執行到這個元件都會等待五秒鐘。

clip_image013

clip_image014

然後點選每一個 [ StateActivity ] 中的 [ eventDrivenActivity ] 裡面的 [ CodeActivity
] 進到程式編輯頁面,撰寫以下的程式。

clip_image015


測試。

都設定完後按下測試,會發現你撰寫的 [ CodeActivity ]一直被輪流執行。因為我們沒有設定結束的點,所以這個程式是會被一直執行下去的。

這就是第一個狀態機的體驗。

clip_image016