您的位置:首页 > 其它

线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析

2017-02-07 15:59 351 查看


方法1、在Form Load事件中加入

 

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

这是是最简单的方式!

 

方法二、使用Invoke调用委托

参考示例代码:

1.定义 委托

   delegate void myDelegate(int i);

   myDelegate mydelegate = null;

2.定义方法,显示消息

 public void ShowMessage(int i)

        {

            this.textBox1.Text = i.ToString();

            this.progressBar1.Value = i;

        }

3.定义方法,驱动消息

 public void MyEvent()

        {

            for (int i = 0; i < 100; i++)

            {

                Thread.Sleep(100);

                this.BeginInvoke(mydelegate, new object[] {i});

            

            }

        }

4: 运行

  private void button1_Click(object sender, EventArgs e)

        {

            mydelegate = new myDelegate(ShowMessage);

            Thread myThread = new Thread(MyEvent);

            //IsBackground 是否后台

            //这个属性很重要 .如果 Thread IsBackground 等于false

            // 当线程还没有结束时,你点了关闭按钮

            // 将抛出An unhandled exception

            //of type 'System.InvalidOperationException'

            //occurred in System.Windows.Forms.dll 异常
            myThread.IsBackground = true;

            myThread.Start();

        }

 

问题分析:

根据错误提示,可知在调试器中运行应用程序时,如果不是控件的创建者线程试图调用该控件时,则调试器会引发 InvalidOperationException,并提示消息:“从不是创建控件 Control Name 的线程访问它。” 说白了,就是资源访问的不一致性,控件的调用者线程不是控件的创建者线程,这是.net实现资源安全访问机制的必然结果。访问 Windows 窗体控件本质上不是线程安全的。如果多个线程同时操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: