c# 线程间操作无效: 从不是创建控件“”的线程访问它。
执行这一句的时候出错dgList.Columns.Insert(pos,temp);c#线程间操作无效:从不是创建控件“”的线程访问它。这个不知道是什么问题?...
执行这一句的时候出错 dgList.Columns.Insert(pos, temp);
c# 线程间操作无效: 从不是创建控件“”的线程访问它。
这个不知道是什么问题? 展开
c# 线程间操作无效: 从不是创建控件“”的线程访问它。
这个不知道是什么问题? 展开
5个回答
展开全部
楼上已经解释的很清楚了,VS2005以上版本跨线程处理。
在MSDN里面可以找到,关键字:线程安全
委托名可以自己定义,
listBoxInfo 可以换成你的dgList。
(如果你直接执行,那么就是从子线程调用主线程的方法执行你的操作,这样是不允许的。
虽然没人告诉我这是为什么,但是我觉得(很多线程同时调用)那样可能会导致死锁的情况。
举例说,我是主线程,电脑是子线程,我能够控制子线程怎么操作,可是你能让电脑控制我吗?显然不能,也不可能。
那为什么引用就可以呢?引用是什么?
引用就是方法的别名,如果你打过游戏,可以理解这是方法的一个副本。
每个线程创建一个我的副本,那么就可以执行了,不会出现争抢,死锁的情况。)
一楼线程安全代码的解释是这样的:
定义一个委托
创建一个方法
{
如果某一个操作需调用主线程的该方法
给他创建一个该方法的副本,调用该方法的副本执行操作
如果并没有调用主线程操作
直接执行【你需要的操作】
}
如果,你还不能理解,我只能说,I'm sorry.I do my best!
在MSDN里面可以找到,关键字:线程安全
委托名可以自己定义,
listBoxInfo 可以换成你的dgList。
(如果你直接执行,那么就是从子线程调用主线程的方法执行你的操作,这样是不允许的。
虽然没人告诉我这是为什么,但是我觉得(很多线程同时调用)那样可能会导致死锁的情况。
举例说,我是主线程,电脑是子线程,我能够控制子线程怎么操作,可是你能让电脑控制我吗?显然不能,也不可能。
那为什么引用就可以呢?引用是什么?
引用就是方法的别名,如果你打过游戏,可以理解这是方法的一个副本。
每个线程创建一个我的副本,那么就可以执行了,不会出现争抢,死锁的情况。)
一楼线程安全代码的解释是这样的:
定义一个委托
创建一个方法
{
如果某一个操作需调用主线程的该方法
给他创建一个该方法的副本,调用该方法的副本执行操作
如果并没有调用主线程操作
直接执行【你需要的操作】
}
如果,你还不能理解,我只能说,I'm sorry.I do my best!
展开全部
C#不允许跨线程调用控件,正确的做法向楼上说的那样,通过控件的invoke方法来调用控件,如果目前不懂又比较着急这个问题的话,把代码编程非托管代码就行了,不过这是不好的,找时间去看看这方面的吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
简单来说就是线程中,1调用线程2中的控件,为了防止线程2中叶给这个控件赋值,引起混乱,所以安全机制对访问进行了限制
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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);
}
}
不知道你明白没?
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);
}
}
不知道你明白没?
追问
可以执行了 我还是没搞懂委托证明解决这个问题的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果不是多人开发的话,建议使用Control.CheckForIllegalCrossThreadCalls = false;解决。这将强制关闭C#winform的跨线程访问检查。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询