跨线程访问控件的问题

当我们在一个线程中想访问主线程创建的控件时可以使用以下代码
Control.CheckForIllegalCrossThreadCalls = false;
但是这是不推荐的,不安全的,在实际的开发中不要使用这种方式;

解决这个问题,可以采用下面的方式:
首先先看一个小案例
点击按钮时将当前的时间赋值给label控件

以下是点击事件的代码

  private void btnStartThread_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(() =>
            {
                //如果是别的线程创建的此控件则返回true
                if (label1.InvokeRequired)
                {
                    Action<string> action = (s) => { this.label1.Text=s;};
                    //让创建该控件的线程去操作; invoke 第一个参数是委托,第二个参数是 传入委托的参数;
                    label1.Invoke(action,DateTime.Now.ToString());
                }
                else
                {
                    label1.Text = DateTime.Now.ToString();
                }
       
            });
            thread.IsBackground = true;
            thread.Start();

        }

这段代码的核心就是label1.InvokeRequired label1.Invoke通过这种方式就能解决跨线程访问控件的问题了

posted @ 2022-10-13 11:20  沈先生爱猫咪  阅读(58)  评论(0编辑  收藏  举报