- UID
- 1066743
|
UI界面无响应,多线程解决UI界面无响应问题
当处理过程比较复杂,或者耗时较长时,容易引起UI界面无响应.
比如我们执行一个复杂的运算,要随时在界面上显示它的结果.但是UI界面卡死了,不能随时看到运算的结果.
这种情况下 我们可以另开线程1,把运算的过程放到线程1中启动,然后用委托唤醒显示语句.
引用线程命名空间
using System.Threading;
//定义线程
private Thread workerThread1 = null;
private void button3_Click(object sender, EventArgs e)
{
//给线程赋值,启动
workerThread1 = new Thread(new ThreadStart(make_number));
workerThread1.Start();
}
//定义委托,显示函数
private delegate void setStatusDelegate(string iteration, string error);
private void setStatus(string a, string b)
{
this.label11.Text = a.ToString();
this.label12.Text = b.ToString();
}
//定义运算函数,也就是运算的过程.里面要用委托调用显示函数.
private void make_number()
{
int a=0;
int b=0;
for(int i=0;i<100;i++)
{
//用委托调用函数
this.Invoke(new setStatusDelegate(setStatus), a.ToString(), b.ToString());
a++;
b=b+2;
}
}
为什么要用委托,而不是直接在make_number函数里 写
this.label1.text=a.tostring();
this.label2.text=b.tostring();
因为会报错,只有form窗体的线程中才能给窗体的控件赋值,线程1不能直接赋值
所以线程1中只是唤醒显示函数,显示函数仍是处于窗体线程中. |
|