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

最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时,遇到这样的问题,

错误显示:

未处理的“System.InvalidOperationException”类型的异常出现在 System.Windows.Forms.dll 中。

其他信息: 线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。

以前很少做关于线程的程序,而且对于线程的理解也不是很深,无奈只好百度之。很快从网上找到了解决方案:

方法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 窗体控件本质上不是线程安全的。如果多个线程同时操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。

 

更详细的解释请参看:

http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/misMultithreading.mspx?mfr=true

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

灵雨飘零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值