TestClass类:
class TestClass { //声明一个delegate(委托)类型:testDelegate,该类型可以搭载返回值为空,参数只有一个(long型)的方法。 public delegate void testDelegate(long i); //声明一个testDelegate类型的对象。该对象代表了返回值为空,参数只有一个(long型)的方法。它可以搭载N个方法。 public testDelegate mainThread; /// <summary> /// 测试方法 /// </summary> public void testFunction() { long i = 0; while (true) { i++; mainThread(i); //调用委托对象 Thread.Sleep(1000); //线程等待1000毫秒 } } }
winform界面代码:
/// <summary> /// 按钮单击事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { //创建TestClass类的对象 TestClass testclass = new TestClass(); //在testclass对象的mainThread(委托)对象上搭载两个方法,在线程中调用mainThread对象时相当于调用了这两个方法。 testclass.mainThread = new TestClass.testDelegate(refreshLabMessage1); testclass.mainThread += new TestClass.testDelegate(refreshLabMessage2); //创建一个无参数的线程,这个线程执行TestClass类中的testFunction方法。 Thread testclassThread = new Thread(new ThreadStart(testclass.testFunction)); //启动线程,启动之后线程才开始执行 testclassThread.Start(); } /// <summary> /// 在界面上更新线程执行次数 /// </summary> /// <param name="i"></param> private void refreshLabMessage1(long i) { //判断该方法是否被主线程调用,也就是创建labMessage1控件的线程,当控件的InvokeRequired属性为ture时,说明是被主线程以外的线程调用。如果不加判断,会造成异常 if (this.labMessage1.InvokeRequired) { //再次创建一个TestClass类的对象 TestClass testclass = new TestClass(); //为新对象的mainThread对象搭载方法 testclass.mainThread = new TestClass.testDelegate(refreshLabMessage1); //this指窗体,在这调用窗体的Invoke方法,也就是用窗体的创建线程来执行mainThread对象委托的方法,再加上需要的参数(i) this.Invoke(testclass.mainThread,new object[] {i}); } else { labMessage1.Text = i.ToString(); } } /// <summary> /// 在界面上更新线程执行次数 /// </summary> /// <param name="i"></param> private void refreshLabMessage2(long i) { //同上 if (this.labMessage2.InvokeRequired) { //再次创建一个TestClass类的对象 TestClass testclass = new TestClass(); //为新对象的mainThread对象搭载方法 testclass.mainThread = new TestClass.testDelegate(refreshLabMessage2); //this指窗体,在这调用窗体的Invoke方法,也就是用窗体的创建线程来执行mainThread对象委托的方法,再加上需要的参数(i) this.Invoke(testclass.mainThread, new object[] { i }); } else { labMessage2.Text = i.ToString(); } }