线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
2017-02-07 15:59
351 查看
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 窗体控件本质上不是线程安全的。如果多个线程同时操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。
相关文章推荐
- 节点门面和自定义事件研究
- 转发——谷歌云官方:一小时掌握深度学习和 TensorFlow
- symfony2实现从数据库获取数据的方法
- 2017任务
- window.XMLHttpRequest对象详解
- 特征的选择_03:ChiSqSelector卡方选择器
- destoon中自定义字段的前台显示,及修改相关属性
- 188. Best Time to Buy and Sell Stock IV
- Spring的JdbcTemplate
- J2EE异常处理写法总结
- 使用jmeter进行APP接口测试经验总结
- elasticsearch安装与使用(4)-- 安装中文分词插件elasticsearch 的 jdbc
- WIN7不能被远程桌面问题
- 算法笔记_019:背包问题(Java)
- ffprobe使用详解
- C++ typedef用法详解(转)
- CentOS 7 最小化安装后的注意事项及一些必备组件的安装
- CentOS 7 最小化安装后的注意事项及一些必备组件的安装
- BP神经网络C++代码
- C++函数的递归调用