如何跨越线程调用窗体控件?(3)
一、前言VS中,如果UI背后的处理工作复杂,可以启用多线程进行处理,用户不喜欢反应慢的程序。在执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速。那么如果在UI上反应最新的处理状态呢?这就是如果在子线程(即新开启的处理复杂任务的线程)中更新UI处理状态信息
二、通过设置Form属性
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
注意红色部分代码
缺点:将UI传给了子线程,违背了弱耦合、封装的思想。子线程去更新UI的状态,如果有多个不同主线程要获取子线程状态,怎么办?
public partial class Form1 : Form
    {
        public subThread subPro = null;
        public Form1()
        {
            InitializeComponent();
            Form1.CheckForIllegalCrossThreadCalls = false;
        }
        private void 启动子线程_Click(object sender, EventArgs e)
        {
            subPro = new subThread(this);
            ThreadStart threadFunc = new ThreadStart(subPro.Process);  //注意,使用了有参数构造函数。将UI对象传给了子线程
            Thread thread1 = new Thread(threadFunc);
            thread1.Start();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = subPro.count.ToString();
        }
    }
    public class subThread
    {
        public int count = 0;
        public Form1 thisForm = null;
        public subThread()
        {
}
        public subThread(Form1 form)
        {
            this.thisForm = form;
        }
        public void Process()
        {
            bool flag = true;
            do
            {
                count++;
                thisForm.txtDisplay.Text = count.ToString();   //注意,直接修改了UI的界面
                Thread.Sleep(1000);
                if (count > 10000)
                {
                    flag = false;
                }
            } while (flag);
        }
    }
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号