转 C#利用委托跨线程更新UI数据

发布于:
分类: Microsoft.Net Tagged

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(); 
    } 
}

 

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注