C#多線程Thread類的使用(二)

前面的篇章介紹了多線程的基本概念和基本使用,下面介紹怎樣處理帶有回調功能的多線程。所謂回調就是執行完成後調用一些方法做最後的處理。例如我們想要在多線程執行完成後調用方法來表達多線程執行完畢。

一、封裝帶有回調函數的線程

#region  //封裝帶有回調函數的線程
private void ThreadWithCallBack(ThreadStart threadStart, Action actionCallback)  //自定義帶回調的多線程調用方法
{
    ThreadStart threadstart2 = () =>      //Invoke()方法表示的是委託同步調用
    {
        threadStart.Invoke();         //先調用
        actionCallback.Invoke();      //後調用,如此便可以保證回調委託必定在多線程委託後執行
    };
    Thread newthread=new Thread(threadstart2);  //開啓新線程,執行threadstart2中的方法。
    newthread.Start();                    //線程開始
}

private void button3_Click(object sender, EventArgs e)
{
    Action myCallBack = () => Console.WriteLine("回調方法調用結束");  //聲明和定義回調委託

    ThreadStart threadstart = () =>                            //聲明和定義線程委託,
    {
        this.doSomething1("方法1");                          //多線程待調用方法1
        this.doSomething2("方法2");                          //多線程待調用方法2
    };
    ThreadWithCallBack(threadstart,myCallBack);             //多線程調用帶回調

    Console.WriteLine("多線程帶回調方法調用結束");          
}
#endregion

上述代碼執行的結果爲:
在這裏插入圖片描述
由上述代碼執行的結果可以看出,由於線程的作用,主線程沒有阻塞,所以首先輸出“多線程帶回調方法調用結束”。然後按照ThreadStart委託對象中待調用方法順序逐次調用,先調用doSomething1,後調用doSomething2。兩個方法調用完畢後才調用最後的回調委託的方法,輸出“回調方法調用結束”

二、調用帶回調和返回值的方法

#region   //調用帶回調和返回值的方法
private int dodo()    //先定義一個帶有返回值的方法
{
    ParameterizedThreadStart threadStart = a =>   //有參的要用ParamterizedThreadStart委託
    {
        this.doSomething1((string)a);
    };
    Thread newThread = new Thread(threadStart);
    newThread.Start("帶有返回值的多線程演示");     //新線程開始,並將參數傳入
    return 100;                                  //返回值
}

private Func<T> ThreadWithResult<T>(Func<T> func)   //封裝一個帶有返回值的方法,用於處理有返回值類型的方式
{
    T t=default(T);

    ThreadStart threadStart = ()=>t=func.Invoke();
    Thread thread = new Thread(threadStart);
    thread.Start();

    return new Func<T>(() =>  //下面的兩個語句不會立即處理,而是被包含在Lambda表達式的委託中返回出去,由被調函數執行
    {
        thread.Join();  
        return t;
    });

}

private void button4_Click(object sender, EventArgs e)
{
    Func<int> myFunc = () => dodo();

    Func<int> Iresult = ThreadWithResult(myFunc);

    Console.WriteLine("執行結束");

    Console.WriteLine("最終結果值爲:"+Iresult.Invoke()); 
}
#endregion

在這裏插入圖片描述
由上面執行的結果我們可以看出來,由於多線程的作用,最先輸出的爲“執行結束”。然後由於無阻塞作用,直接輸出“最終結果值爲:100”。接着dodo開啓的線程執行完成doSomething1.輸出“用:帶有返回值的多線程演示在11線程中執行方法1”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章