Tuesday, March 29, 2011

[WF4] Workflow Foundation : Asynchronous 異步執行

繼續來介紹 Workflow Foundation 4 ,這次要說的是如何以非同步執行的方式去呼叫 Workflow ,如果有接觸過workflow,應該會知道最簡單的呼叫方式是用 WorkflowInvoker.Invoke ,但是使用這個方式去呼叫 workflow ,程式會等到這個workflow執行完後再去執行接下來要做的事,所以要改成異步執行,才能讓程式可以把事丟給 workflow 後,就立即繼續做下面的事情,下面用範例來介紹如何做到。


WorkflowInvoker

我先建一個 Workflow Console Application 用來作範例的專案,然後隨便建了一個Activity,內容如上圖,就是暫停五秒後印出一行加入了傳入值的字。

然後用三種方法去呼叫 Activity1 這個 workflow 。


1) WorkflowInvoker.Invoke
WorkflowInvoker_01
從結果可以很明顯的看出來,程式會在等 Activity1 這個 workflow 跑完後,才執行下面的工作。


2) InvokeAsync
WorkflowInvoker_02
使用 InvokeAsync 方法的話,就可以實現 Asynchronous 的效果了,除此之外,還可以去抓 InvokeCompleted 事件來在工作流程完成後做事。


3) WorkflowApplication
WorkflowInvoker_03
使用 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

1 comment:

  1. 其實我寫到後來,不太曉得這功能是要叫同步執行還是異步執行,反正就是丟給WF後,它會自己做它的就是,然後程式會繼續跑。

    ReplyDelete