学习C#语言时,经常会遇到C#多线程启动Square问题,这里将介绍C#多线程启动Square问题的解决方法。
在实际工作中,还需要使用到C#多线程的许多复杂特性。其中一个问题就是如何将程序的数据由线程类的构造器传入或者传出。对于放到另外一个线程中的过程,既不能传参数给它,也不能由它返回值,因为传入到线程构造器的过程是不能拥有任何参数或者返回值的。为了解决这个问题,可以将过程封装到一个类中,这样,方法的参数就可使用类中的字段。
本文给出了一个简单的例子,计算一个数的平方。为了在一个新的线程中使用这个过程,将它封装到一个类中,在一个新的C#多线程启动Square过程。
public class SquareClass
{
publicdouble Value;
public double Square;
public void CalcSquare()
{
Square = Value * Value;
}
}
private void button1_Click(object sender, System.EventArgs e)
{
SquareClass oSquare =new SquareClass();
t2 = new Thread(new ThreadStart(oSquare.CalcSquare));
oSquare.Value = 30;
t2.Start();
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
在上述例子中,线程启动后,并没有检查类中的square值,因为即使调用了线程的start方法,也不能确保其中的方法马上执行完。要从另一个线程中得到需要的值,有几种方法,其中一种方法就是在线程完成的时候触发一个事件。下面所示的代码为SquareClass加入了事件声明。
public delegate void EventHandler(double sq);//说明委派类型
public class SquareClass
{
publicdouble Value;
public double Square;
public event EventHandler ThreadComplete;//说明事件对象
public void CalcSquare()
{
Square = Value * Value;
//指定事件处理程序
ThreadComplete+=new EventHandler(SquareEventHandler);
if( ThreadComplete!=null)ThreadComplete(Square);//触发事件
}
public static void SquareEventHandler(doubleSquare )
//定义事件处理程序
{
MessageBox.Show(Square.ToString ());}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
对于这种方法,要注意的是事件处理程序SquareEventHandler运行在产生该事件的线程t2中,而不是运行在窗体执行的线程中。以上介绍C#多线程启动Square。
【编辑推荐】