线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
来源:互联网 发布:童谣男人 知乎 编辑:程序博客网 时间:2024/05/21 07:52
最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时,遇到这样的问题,
错误显示:
未处理的“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
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- WinForm中线程问题:线程间操作无效: 从不是创建控件“...”的线程访问它
- c#线程问题:线程间操作无效:从不是创建控件 的线程访问它
- WinForm中线程问题:线程间操作无效: 从不是创建控件“...”的线程访问它
- 线程间操作无效: 从不是创建控件的线程访问它 解决方案
- 线程间操作无效: 从不是创建控件的线程访问它 解决方案
- Exception:线程间操作无效: 从不是创建控件的线程访问它 解决方案
- c#关于“线程间操作无效: 从不是创建控件的线程访问它”的问题
- 线程间操作无效:从不是创建控件“XX”的线程访问它,多线程问题
- C#多线程问题:线程间操作无效: 从不是创建控件“label4”的线程访问它
- 关于VS编译出现“从不是创建控件 control name 的线程访问它”问题的解决方案
- 后台线程与UI线程问题:解决“线程间操作无效: 从不是创建控件xxx的线程访问它”
- Winform线程间操作无效从不是创建控件的线程访问它的几个解决方案async和await?
- 编写Servlet的三种方法
- 导向恶意网站的搜索引擎搜索结果
- 会感染电脑的恶意Flash文件
- 恶意PDF文件
- 简单控件基本应用
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- mod在java与plsql中的效率比较
- JQuery+Ajax实现GridView的显示详细内容
- 菜单、工具栏、状态栏
- C#的Access数据库的连接类
- (反汇编)逻辑语句的纯算术实现
- 自己犯过的很傻的错误...
- stock
- 2011年6月7日