前面的篇章介紹了多線程的基本概念和基本使用,下面介紹怎樣處理帶有回調功能的多線程。所謂回調就是執行完成後調用一些方法做最後的處理。例如我們想要在多線程執行完成後調用方法來表達多線程執行完畢。
一、封裝帶有回調函數的線程
#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”