前面的篇章介绍了多线程的基本概念和基本使用,下面介绍怎样处理带有回调功能的多线程。所谓回调就是执行完成后调用一些方法做最后的处理。例如我们想要在多线程执行完成后调用方法来表达多线程执行完毕。
一、封装带有回调函数的线程
#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”