返回首页
当前位置: 主页 > 网络编程 > .Net实例教程 >

C#利用委托跨线程更新窗体数据

时间:2013-04-06 12:34来源:2018年最新注册送彩金www.zhixing123.cn 编辑:麦田守望者

在C#多线程编程中,经常会遇到线程与界面交互的情况,或者是需要获得线程信息来确定线程的状态,比较好的解决方法是用委托来实现。下例中,利用委托和跨线程访问技术,实现界面上的两个label控件实时显示线程的执行次数:

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

顶一下
(1)
100%
踩一下
(0)
0%
标签(Tag):C# C#实例教程 c#基础教程 C#源代码 c#技巧
------分隔线----------------------------
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码:点击我更换图片
博聚网