线程间操作无效: 从不是创建控件“textBox1”的线程访问它 背景:通过一个辅助线程计算出的一个值赋给textBox1.text;解决办法:1.直接在窗体的构造函数中加:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 此时把所有的控件 合法性线程检查全部都给禁止掉了. 2.通过代理来解决(msdn) private delegate void SetTextCallback(string text);…
最简单的方法(不推荐): 在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false; 为什么不推荐上面的方法: 为避免空间造成死锁, .net framework 2.0 之后 拒绝多线程访问空间, 以前Control.CheckForIllegalCrossThreadCalls 默认就是flase, 2.0后默认为true.当然如果能保证程序中不会好几个线程同时操作一个控件用上面的方法也可以, 如果存在多个线程一起操作控件使用下面的方法;…
在winform编程中常遇到此类问题,造成辅助线程无法给控件赋值 //定义委托 private delegate void SetTextCallback(string text); //在给textBox1.text赋值的地方调用以下方法即可 private void SetText(string text) { // InvokeRequired需要比较调用线程ID和创建线程ID // 如果它们不相同则返回true if (this.textBox1.InvokeRequired) { Se…
线程开始前: Control.CheckForIllegalCrossThreadCalls = false;…
今天遇到这个问题,百度了下,把解决的方法总结出来.我们在ui线程创建的子线程操作ui控件时,系统提示错误详细信息为:线程间操作无效: 从不是创建控件“XXX”的线程访问它. 就我知道的有三种方法,先看一下msdn的介绍: 访问 Windows 窗体控件本质上不是线程安全的.如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态. 还可能出现其他与线程相关的 bug,包括争用情况和死锁.确保以线程安全方式访问控件非常重要. 看下解决办法吧 1.把CheckForIllega…
关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 界面上2个控件,一个按钮和一个进度条using System;using System.Threading;using System.Windows.Forms; namespace WindowsFormsApplication2{    public partial class Form1 :…
有两种方式解决 1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;2.使用Invoke等委托函数 问题原因是 .NET2.0 以后拒绝多线程访问空间,避免空间造成死锁.以前Control.CheckForIllegalCrossThreadCalls =false;默认就是这样,现在默认为true.如果不会好几个线程同时操作一个控件用方法1就可以.如果存在多个线程一起操作控件使用方法2 我们在用线程操作的时候,可能会出现异常:线程…
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“btnSearch”的线程访问它.”这个问题属于跨线程问题 在Form1重载中写上一行代码 System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;…
“System.InvalidOperationException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 线程间操作无效: 从不是创建控件“txtPortName02”的线程访问它. 解决方法: 1 构造方法中添加 CheckForIllegalCrossThreadCalls = false; 2 方法二 invoke txtPortName02.Invoke(new Action<string>((str) => { label…
最近在修改自动化小工具,用多线程来解决后台拷贝导致WinForm界面卡死的情况,但是遇到过错:线程间操作无效: 从不是创建控件“dataGridView”的线程访问它. 这是因为在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,有2种解决方法: 1. 在Form_Load中添加: //取消跨线程检查 Control.CheckForIllegalCrossThreadCalls = false; 这样进行非安全线程访问时,运行环境就不去检验它是否是线程安全的.…