线程间操作无效: 从不是创建控件"Form1"的线程访问它.

我用this调用Form1的,出现了这个错误

线程间操作无效: 从不是创建控件"Form1"的线程访问它,是设置错误造成的,解决方法如下:

1、首先在VS里面新增一个WinForm项目,在窗体里面新增一个按钮和一个文本框。

2、然后在文本框设置下吗,允许多行的属性。

3、然后给按钮新增一个执行线程的代码,注意关键性的代码:this.Invoke(new Action(() =>  这里写控件  }))。

4、然后执行效果,就是每隔一秒输出一个数字,这个效果一般是用在写日志上,或者一些实时提示,就完成了。

5、最后注意,如果不加在线程里面直接用的话会报错,如图所示。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2017-09-10
有两种方式解决
1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;
2.使用Invoke等委托函数。

问题原因是。net2.0以后拒绝多线程访问空间,避免空间造成死锁。以前Control.CheckForIllegalCrossThreadCalls =false;默认就是这样,现在默认为true。
如果不会好几个线程同时操作一个控件用方法1就可以。如果存在多个线程一起操作控件使用方法2

方法2可以

Invoke(new MethodInvoker(delegate()
{
//do something... }));本回答被提问者采纳
第2个回答  2012-10-30
把错误的代码贴出来追问

displayForm mydf = new displayForm();
mydf.MdiParent = this;
mydf.Show();
以上就是代码,是在子线程函数里面的

追答

有没有设置
Form.CheckForIllegalCrossThreadCalls = false;
是否进行控件操作线程的检查
这句代码

追问

搞出来了,谢谢

线程间操作无效: 从不是创建控件"Form1"的线程访问它.
线程间操作无效: 从不是创建控件"Form1"的线程访问它,是设置错误造成的,解决方法如下:1、首先在VS里面新增一个WinForm项目,在窗体里面新增一个按钮和一个文本框。2、然后在文本框设置下吗,允许多行的属性。3、然后给按钮新增一个执行线程的代码,注意关键性的代码:this.Invoke(new Action(() ...

线程间操作无效: 从不是创建控件"Form1"的线程访问它.
线程间操作无效: 从不是创建控件"Form1"的线程访问它,是设置错误造成的,解决方法如下:1、首先在VS里面新增一个WinForm项目,在窗体里面新增一个按钮和一个文本框。2、然后在文本框设置下吗,允许多行的属性。3、然后给按钮新增一个执行线程的代码,注意关键性的代码:this.Invoke(new Action(() ...

线程间操作无效,显示:从不是创建控件"Form1"的线程访问它,是什么原因...
2.通过代理来解决(msdn)private delegate void SetTextCallback(string text); \/\/在给textBox1.text赋值的地方调用以下方法即可 private void SetText(string text) { \/\/ InvokeRequired需要比较调用线程ID和创建线程ID \/\/ 如果它们不相同则返回true if (this.textBox1.InvokeRequired) { SetTextCallback ...

...线程间操作无效:从不是创建控件“richTextBox1”的线程访问它。为什...
默认情况下,C#不允许在一个线程中直接操作另一个线程中的控件,这是因为访问Windows窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的bug,以及不同线程争用控件引起的死锁问题。因此确保以线程安全方式访问控...

c#线程问题:线程间操作无效:从不是创建控件picMonster1的线程访问...
public Form1(){ InitializeComponent();} private void button1_Click(object sender, EventArgs e)\/\/此处先双击button1以便产生代码并且自动创建事件委托 { new System.Threading.Thread(new System.Threading.ThreadStart (新线程)).Start();\/\/创建一个新的线程并启动 } public void 设置文字(){ bu...

教你如何解决“线程间操作无效: 从不是创建控件的线程访问它”
这个时候程序会卡,当程序员将这些卡代码放进线程(Thread)中后发现当对控件操作时出现线程间操作无效: 从不是创建控件的线程访问它异常。这里通过一个实例来告诉大家BackGroundWorker的用法。首先我们先定义一个BackGroundWorker,大家可以去面板上拖一个,也可以自己手工定义一个。this.backgroundWorker_...

c# 线程间操作无效:从不是创建控件的线程访问,对于windows控件可以使用...
不是创建控件的线程访问,意思是你访问控件的代码所在的 线程 和创建控件的 线程(通常是主线程)不是同一个线程。和是不是别人的控件没关系。比如 在formload事件里面new thread,然后在这个thread里面调用this.Text = "tt";就会报这个错误。解决办法就是在跨线程的代码里面使用this.begininvoke(new ...

线程间操作无效: 从不是创建控件“textBox1”的线程访问它.关于tcpip...
private void SetText(){ if(textBox1.InvokeRequired){ action d = new action(SetText);\/\/系统自带的委托 不带参数 this.invoke(d);} else { textBox1.Text = recvStr;} } \/\/定义委托 private delegate void SetTextHander();\/\/不带参数 private delegate void SetTextHander(string recv...

Winform 跨线程更新UI控件常用方法
C# Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常。处理跨线程更新Winform UI控件常用的方法有4种:通过UI线程的SynchronizationContext的Post\/Send方法更新;通过UI控件的Invoke\/BegainInvoke方法更新;通过BackgroundWorker取代Thread...

c#窗体发生自动关闭
子线程并不会关闭窗体,即使发生错误,我觉得你可能出在的问题是在:线程会向FormA窗体上传递一些反馈信息这个地方,你有可能没使用委托,来回调窗体方法而发生:线程间操作无效: 从不是创建控件“???”的线程访问它。

相似回答