c# 线程间操作无效: 从不是创建控件“”的线程访问它。

执行这一句的时候出错dgList.Columns.Insert(pos,temp);c#线程间操作无效:从不是创建控件“”的线程访问它。这个不知道是什么问题?... 执行这一句的时候出错 dgList.Columns.Insert(pos, temp);

c# 线程间操作无效: 从不是创建控件“”的线程访问它。

这个不知道是什么问题?
展开
 我来答
中国动漫之声
推荐于2018-05-10 · 关注我,不要怕,我不吃人~
中国动漫之声
采纳数:250 获赞数:1391

向TA提问 私信TA
展开全部
楼上已经解释的很清楚了,VS2005以上版本跨线程处理。
在MSDN里面可以找到,关键字:线程安全
委托名可以自己定义,
listBoxInfo 可以换成你的dgList。
(如果你直接执行,那么就是从子线程调用主线程的方法执行你的操作,这样是不允许的。
虽然没人告诉我这是为什么,但是我觉得(很多线程同时调用)那样可能会导致死锁的情况。
举例说,我是主线程,电脑是子线程,我能够控制子线程怎么操作,可是你能让电脑控制我吗?显然不能,也不可能。
那为什么引用就可以呢?引用是什么?
引用就是方法的别名,如果你打过游戏,可以理解这是方法的一个副本。
每个线程创建一个我的副本,那么就可以执行了,不会出现争抢,死锁的情况。)

一楼线程安全代码的解释是这样的:
定义一个委托
创建一个方法
{
如果某一个操作需调用主线程的该方法
给他创建一个该方法的副本,调用该方法的副本执行操作
如果并没有调用主线程操作
直接执行【你需要的操作】
}

如果,你还不能理解,我只能说,I'm sorry.I do my best!
1375191918
2012-04-30
知道答主
回答量:13
采纳率:0%
帮助的人:9.8万
展开全部
C#不允许跨线程调用控件,正确的做法向楼上说的那样,通过控件的invoke方法来调用控件,如果目前不懂又比较着急这个问题的话,把代码编程非托管代码就行了,不过这是不好的,找时间去看看这方面的吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友bdd6af1cde
2012-05-31 · 超过28用户采纳过TA的回答
知道答主
回答量:103
采纳率:0%
帮助的人:53.7万
展开全部
简单来说就是线程中,1调用线程2中的控件,为了防止线程2中叶给这个控件赋值,引起混乱,所以安全机制对访问进行了限制
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
花胶之家
2012-04-29 · TA获得超过250个赞
知道小有建树答主
回答量:215
采纳率:100%
帮助的人:61.4万
展开全部
c#不允许对跨线程的控件的访问,如需操作跨线程的操作需要通过委托(delegate),即是函数指针来操作跨线程。说明dgList控件不是该线程的控件,需要使用委托操作。比如:
delegate void SetListBoxCallback(string str); //定义委托
public void SetListBox(string str)
{
if (listBoxInfo.InvokeRequired) //控件是否跨线程?如果是,则执行括号里代码
{
SetListBoxCallback setListCallback = new SetListBoxCallback(SetListBox); //实例化委托对象
listBoxInfo.Invoke(setListCallback, str); //重新调用SetListBox函数
}
else //否则,即是本线程的控件,控件直接操作
{
listBoxInfo.Items.Add(str);
}
}
不知道你明白没?
追问
可以执行了    我还是没搞懂委托证明解决这个问题的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gwl3323405
2012-09-12 · TA获得超过1226个赞
知道小有建树答主
回答量:1423
采纳率:33%
帮助的人:785万
展开全部
如果不是多人开发的话,建议使用Control.CheckForIllegalCrossThreadCalls = false;解决。这将强制关闭C#winform的跨线程访问检查。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式