探索工作流(六)--多線程

            上篇播客中介紹了WorkflowApplication對象創建工作流和此對象的生命週期,本文繼續介紹有關WorkflowApplication對象的內容--多線程和持久化。
        1 爲什麼使用多線程
        我們知道,WorkflowInvoker對象不支持多線程,當前任務和工作流流程共用一個線程,這樣就造成了一種現象,我們在同一時間只能執行一件事,當前的業務和工作流的創建運行不能同時進行,降低了程序的執行效率,並且用戶體驗也不好;鑑於此,WF提供了WorkflowApplication對象以支持多線程,這樣,我們的業務程序和工作流操作可以同時進行了,提高了程序執行效率,用戶體驗較好。
        2 代碼實現
    //非繼承自定義控件類,需要繼承底層類
    class naTiveActivityTest : NativeActivity
    {
        //定義兩個輸入參數和一個輸出參數
        public InArgument<int> input1 { get; set; }
        public InArgument<int> input2 { get; set; }
        public OutArgument<int> output { get; set; }
        //自定義控件類默認執行的方法
        protected override void Execute(NativeActivityContext context)
        {
            //從上下文獲取輸入參數,計算後得到輸出參數,傳入到上下文中
            int getInput1 = input1.Get(context);
            int getInput2 = input2.Get(context);
            context.SetValue(output, getInput1 + getInput2);
        }
    } 

    class Program
    {
        static void Main(string[] args)
        {
            //定義一個字典,傳入輸入參數
            IDictionary<string, object> dic = new Dictionary<string, object>();
            dic.Add("input1", 1);
            dic.Add("input2", 2);
            //定義工作流宿主
            WorkflowApplication application = new WorkflowApplication(new naTiveActivityTest(),dic);
            //註冊工作流結束時執行的事件
            application.Completed += workflowCompleted;
            //註冊工作流卸載時執行的事件
            application.Unloaded += workflowOnUnloaded;
            application.Run();
            //主線程睡眠一秒鐘
            System.Threading.Thread.Sleep(1000);
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("mainThread:" + i + "   " + System.DateTime.Now.ToString());
                //主線程睡眠一秒鐘
                System.Threading.Thread.Sleep(1000);
            }
            Console.ReadKey();
        }

        //定義流程完成時執行的事件
        public static void workflowCompleted(WorkflowApplicationCompletedEventArgs e)
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("workflowCompleted:" + i + "   " + System.DateTime.Now.ToString());
                //當前線程睡眠一秒鐘
                System.Threading.Thread.Sleep(1000);
            }
        }

        //定義流程卸載時執行的事件
        public static void workflowOnUnloaded(WorkflowApplicationEventArgs e)
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("workflowUnLoaded:" + i +"   " + System.DateTime.Now.ToString());
                //當前線程睡眠一秒鐘
                System.Threading.Thread.Sleep(1000);
            }
        }
    }

3 運行結果


4 代碼說明
首先,定義一個自定義控件類,類中有兩個輸入參數,輸入參數相加得到輸出參數;然後在主程序中定義兩個事件,分別是流程完成時和流程卸載時執行的事件,每個事件分別輸出一句話和當前時間,並且在循環中睡眠當前線程一秒鐘;主程序中定義一個工作流宿主,註冊剛纔定義的兩個事件,創建並啓動工作流,主程序中也使用循環打印一句話和當前時間,並且睡眠當前線程一秒鐘。

下圖爲流程執行順序圖解:


5 運行結果分析
我們的程序功能就是,創建並且啓動工作流,最後卸載工作流,在整個過程中,通過控制檯輸出時間;可以看到控制檯輸出數據分爲三部分,分別是工作流完成、主線程和工作流卸載,因爲工作流的事件有執行順序,所以工作流完成時的事件和主線程並行執行,因爲設置了線程睡眠事件,所以他們可以交替執行,最後執行工作流卸載事件。


發佈了124 篇原創文章 · 獲贊 168 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章