1. 程式人生 > >探索工作流(六)--多執行緒

探索工作流(六)--多執行緒

            上篇播客中介紹了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 執行結果分析
我們的程式功能就是,建立並且啟動工作流,最後解除安裝工作流,在整個過程中,通過控制檯輸出時間;可以看到控制檯輸出資料分為三部分,分別是工作流完成、主執行緒和工作流解除安裝,因為工作流的事件有執行順序,所以工作流完成時的事件和主執行緒並行執行,因為設定了執行緒睡眠事件,所以他們可以交替執行,最後執行工作流解除安裝事件。

相關推薦

探索工作--執行

            上篇播客中介紹了WorkflowApplication物件建立工作流和此物件的生命週期,本文繼續介紹有關WorkflowApplication物件的內容--多執行緒和持久化。         1 為什麼使用多執行緒         我們知道,Work

Boost——執行

結合Boost官網 多執行緒的難點在於同步執行,需要“鎖”控制所有權。 鎖有分:互斥鎖,條件變數... 互斥鎖:boost::mutex 獲取和釋放成對存在,也可以用boost::lock_guard<boost::mutex> lock(mutex); boost::l

探索工作--順序工作 Sequence

上篇文章簡要介紹了狀態工作流的基本知識,這片文章我們介紹順序工作流--SequenceWorlflow。 1 新建一個工作流控制檯應用程式,也就是順序流專案,需要在.NET Framework4.0版

JAVA基礎複習執行和網路

1、建立執行緒和任務,如: //任務類必須實現Runnable介面 public class TaskClass implements Runnable{ ... public TaskClass(...){ ... } //想要在該執行緒執行的

JAVA進階06執行

一、三個概念 1、程式 程式(Program)是一個靜態的概念,一般對應於作業系統中的一個可執行檔案 2、程序 (1)執行中的程式叫做程序(Process),是一個動態的概念 (2)特點: 程序是程式的一次動態執行過程, 佔用特定的地址空間 每個程序由3

Python高階程式設計執行

Python 多執行緒 多執行緒類似於同時執行多個不同程式,多執行緒執行有如下優點: 使用執行緒可以把佔據長時間的程式中的任務放到後臺去處理。 使用者介面可以更加吸引人,這樣比如使用者點選了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度 程式的執

執行基礎-執行併發安全問題

多執行緒基礎(三)-多執行緒併發安全問題 當多個執行緒併發操作同一資源時,由於執行緒切換實際不可控會導致操作邏輯執行順序出現混亂,嚴重時會導致系統癱瘓。例如下面的程式碼 public class SyncDemo { public static void main(Strin

Java併發程式設計執行四種實現方式

Java實現多執行緒的方式 Java實現多執行緒的方式有4種: 繼承Thread方法、實現Runnable介面、實現Callable介面並通過FutureTask建立執行緒、使用ExecutorService。 其中,前兩種執行緒執行結果沒有返回值,後兩種是有返回值的。 1、繼承Th

執行說學逗唱:關於執行那不得不說的二三事

(二)多執行緒說學逗唱:新手村偶遇Thread類 為什麼一上來就要寫這個 這個是啥,那個那個是啥,直接進去主題不好嗎?以前我也是這麼想的,可是後來呀…總之,一個不刨根問底的程式設計師不是好程式設計師,要深究一個知識點還就得知道他是從哪裡來,到哪裡去,既然來到這個事件

執行說學逗唱:村口的老R頭是個掃地僧Runnable

(一)多執行緒說學逗唱:關於執行緒那不得不說的二三事 (二)多執行緒說學逗唱:新手村偶遇Thread類 上一篇我們講到Thread這個類以及簡單地說了下執行緒執行的隨機性,相信大家對執行緒的使用有了不小的瞭解… 繼承Thread介面是實現多執行緒

執行說學逗唱:執行險惡,變數和執行安全不得不防

(一)多執行緒說學逗唱:關於執行緒那不得不說的二三事 (二)多執行緒說學逗唱:新手村偶遇Thread類 (三)多執行緒說學逗唱:村口的老R頭是個掃地僧(Runnable) 出了新手村,以後的路可就不那麼好走了,到底現在也是個江湖人,都必須經歷點困難挫折,要不以後拿什

Java Socket應用執行實現客戶端的通訊

伺服器執行緒處理類ServerThread.java : package com.yijia; import java.io.*; import java.net.Socket; /** * 建立時間:2018/10/4 14:59 * 作者: * 郵箱:[ema

PyQt5進階——執行:QTimer

應用程式開發中多執行緒的必要性: 一般情況下,應用程式都是單執行緒執行的,但是對GUI程式來說,單執行緒有時候滿足不了要求,但是對於一些特殊情況:比如一個耗時較長的操作,執行過程會有卡頓讓使用者以為程式出錯而把程式關閉或是系統本身認為程式執行出錯而自動關閉程式。這個時候就

PyQt5進階——執行:QThread & 事件處理

接上篇… 2. QThread 要使用QThread開始一個執行緒,可以建立它的一個子類,然後覆蓋其QThread.run()函式 class Thread(QThread): def __init__(self): super().__init__()

MFC筆記——執行程式設計1:模組、程序、執行間的基本概念

一、模組、程序、執行緒 1.1 模組         一段可執行的程式(包括EXE和DLL),其程式程式碼、資料、資源被載入到記憶體中,由系統建立一個數據結構來管理它。這段程式就是一個模組。這裡所說

python高階——執行2執行UDP聊天器

import socket import threading def recv_msg(udp_socket): # 接收資料 while True: recv_data = udp_socket.recvfrom(1024) print(recv

執行3-執行訪問共享物件和資料的方式

在多執行緒(2)-ThreadLocal,我們討論了執行緒範圍內的資料共享,本篇文章我們討論執行緒之間即多執行緒訪問共享物件和資料的方式 一:Java5之前給共享資料加上鎖synchronized,上程式碼 public class MultiThreadShareDat

執行管理等待執行的終結

宣告:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 譯者:鄭玉婷 校對:方騰飛 等待執行緒的終結 在某些情況下,我們需要等待執行緒的終結。例如,我們可能會遇到程式在執行前需要初始化資源。在執行剩下的程

併發集合使用執行安全的NavigableMap

宣告:本文是《 Java 7 Concurrency Cookbook 》的第六章,作者: Javier Fernández González     譯者:許巧輝 校對:方騰飛 使用執行緒安全的NavigableMap Java API 提供的有趣的資料結構,並且你可以在併發應用程式中使用

非同步程式設計學習之路-執行之間的協作與通訊

本文是非同步程式設計學習之路(三)-多執行緒之間的協作與通訊,若要關注前文,請點選傳送門: 非同步程式設計學習之路(二)-通過Synchronize實現執行緒安全的多執行緒 通過前文,我們學習到如何實現同步的多執行緒,但是在很多情況下,僅僅同步是不夠的,還需要執行緒與執行緒協作(通訊),生產