繼續來介紹 Workflow Foundation 4 ,這次要說的是如何以非同步執行的方式去呼叫 Workflow ,如果有接觸過workflow,應該會知道最簡單的呼叫方式是用 WorkflowInvoker.Invoke ,但是使用這個方式去呼叫 workflow ,程式會等到這個workflow執行完後再去執行接下來要做的事,所以要改成異步執行,才能讓程式可以把事丟給 workflow 後,就立即繼續做下面的事情,下面用範例來介紹如何做到。
我先建一個 Workflow Console Application 用來作範例的專案,然後隨便建了一個Activity,內容如上圖,就是暫停五秒後印出一行加入了傳入值的字。
然後用三種方法去呼叫 Activity1 這個 workflow 。
1) WorkflowInvoker.Invoke
從結果可以很明顯的看出來,程式會在等 Activity1 這個 workflow 跑完後,才執行下面的工作。
2) InvokeAsync
使用 InvokeAsync 方法的話,就可以實現 Asynchronous 的效果了,除此之外,還可以去抓 InvokeCompleted 事件來在工作流程完成後做事。
3) WorkflowApplication
使用 WorkflowApplication 類別同樣也可以做到射後不理的效果,但是比起 InvokeAsync 可以對 workflow 有著更強大的控制能力,詳細的介紹我就不在這邊介紹了(我沒啥用也沒得介紹XD),但是有一點可以提的是,在WF3/3.5時所使用的 WorkflowInstance ,在WF4裡面雖然也是有得用的樣子,但是看起來大都改成用 WorkflowApplication 來做了,所以如果你的 Workflow 需要有比較複雜的功能(例如Persistence),使用 WorkflowApplication 會是比較好的選擇。
其他的東西就看code就懂了。
這是我專案的範例程式碼,Activity就自己拉吧XD
我先建一個 Workflow Console Application 用來作範例的專案,然後隨便建了一個Activity,內容如上圖,就是暫停五秒後印出一行加入了傳入值的字。
然後用三種方法去呼叫 Activity1 這個 workflow 。
1) WorkflowInvoker.Invoke
從結果可以很明顯的看出來,程式會在等 Activity1 這個 workflow 跑完後,才執行下面的工作。
2) InvokeAsync
使用 InvokeAsync 方法的話,就可以實現 Asynchronous 的效果了,除此之外,還可以去抓 InvokeCompleted 事件來在工作流程完成後做事。
3) WorkflowApplication
使用 WorkflowApplication 類別同樣也可以做到射後不理的效果,但是比起 InvokeAsync 可以對 workflow 有著更強大的控制能力,詳細的介紹我就不在這邊介紹了(我沒啥用也沒得介紹XD),但是有一點可以提的是,在WF3/3.5時所使用的 WorkflowInstance ,在WF4裡面雖然也是有得用的樣子,但是看起來大都改成用 WorkflowApplication 來做了,所以如果你的 Workflow 需要有比較複雜的功能(例如Persistence),使用 WorkflowApplication 會是比較好的選擇。
其他的東西就看code就懂了。
這是我專案的範例程式碼,Activity就自己拉吧XD
using System; using System.Activities; using System.Collections.Generic; using System.Threading; namespace WF_Test_1 { class Program { static void Main(string[] args) { //normal using WorkflowInvoker.Invoke , the easy way WorkflowInvoker.Invoke(new Activity1() { i_str = "<Invoke>" }); Console.WriteLine("after WorkflowInvoker.Invoke"); Console.ReadLine(); //using InvokeAsync to run Workflow with Asynchronous var p = new Dictionary<string, object> { { "i_str", "<InvokeAsync>" } }; WorkflowInvoker myInvoker = new WorkflowInvoker(new Activity1()); myInvoker.InvokeAsync(p); Console.WriteLine("after InvokeAsync"); Console.ReadLine(); //using WorkflowApplication to run Workflow with Asynchronous var q = new Dictionary<string, object>{ { "i_str", "<WorkflowApplication>" } }; var workflowApplication = new WorkflowApplication(new Activity1(), q); workflowApplication.SynchronizationContext = new SynchronizationContext(); workflowApplication.Run(); Console.WriteLine("after WorkflowApplication"); Console.ReadLine(); } } }
參考資料:
WorkflowInvoker.InvokeAsync 方法
WorkflowApplication 類別
使用 WorkflowInvoker 與 WorkflowApplication
其實我寫到後來,不太曉得這功能是要叫同步執行還是異步執行,反正就是丟給WF後,它會自己做它的就是,然後程式會繼續跑。
ReplyDelete