博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级
阅读量:5878 次
发布时间:2019-06-19

本文共 1267 字,大约阅读时间需要 4 分钟。

首先在form1的窗体载入中新建了一个Class1对象并将本身的引用传递进入其构造函数,然后在Class1的构造函数中创建一个线程。该线程所代理的方法事件是本类中的一个add方法。而add方法的内容则是在form1上放一个textbox. 然而这个流程你需要注意的有几个问题: 1.哪个是主线程?所谓主线程是第一个启动的线程,是从main开始的。form1的这个窗体是由主线程创建的。 2.Thread t的线程是什么?t是由主线程创建的,t的操作内容是在由主线程创建的窗体上放一个textbox. 也就是说,t的操作是跨线程的窗体操作。虽然把CheckForIllegalCrossThreadCalls 设置成了false,但是还存在在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级这个异常。
解决办法: 1.不要线程,只在一个主线程中操作。此时你在class1中添加控件也好,在form1中写个方法来添加控件也好,都是可行的。 2.通过代理来实现。在对form1对象的操作中 if(form1.InvokeRequired) {
form1.Invoke(d);//d为在主线程中创建的代理引用 //d所代理的方法应该是添加控件的内容 } else {
form1.Controls.add(textBox1);//直接使用 } //代码 class Class1 {
Form1 f1; TextBox textBox1; delegate void addDelegate(); addDelegate d; public Class1(Form1 f1) {
this.f1 = f1; d=new addDelegate(f1.add());//此处的add是在form1中的方法 Thread t = new Thread(new ThreadStart(add)); t.Start(); } public void add() {
if(f1.InvokeRequired) {
f1.Invoke(d); //使用代理 } else {
f1.Controls.add(new TextBox());//...直接调用 } } }
 

转载于:https://www.cnblogs.com/plRobotics-RD-Center/p/4019811.html

你可能感兴趣的文章
作业2
查看>>
raid技术-研究感受
查看>>
远程主机探测技术FAQ集 - 扫描篇
查看>>
C++中调用python函数
查看>>
Nomad添加acl认证
查看>>
“TI门外汉”网路知识笔记一 OSI参考模型
查看>>
你不需要jQuery(五)
查看>>
DatanodeDescriptor说明
查看>>
ServlertContext
查看>>
eclipse编辑器生命周期事件监听
查看>>
Python WOL/WakeOnLan/网络唤醒数据包发送工具
查看>>
sizeof(long)
查看>>
pxe网络启动和GHOST网克
查看>>
2.5-saltstack配置apache
查看>>
http状态响应码大全(复制转帖)
查看>>
django数据库中的时间格式与页面渲染出来的时间格式不一致的处理
查看>>
Python学习笔记
查看>>
java String
查看>>
renhook的使用
查看>>
Linux学习笔记(十二)--命令学习(用户创建、删除等)
查看>>