首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

UI界面无响应,多线程解决UI界面无响应问题

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中只是唤醒显示函数,显示函数仍是处于窗体线程中.
返回列表