首页 新闻 会员 周边 捐助

关于子线程访问主线程创建的控件的问题

0
[已解决问题] 解决于 2013-01-26 09:33

上网搜了下资料,说是用Control.Invoke方法就可以,但是经过调试发现,只要我用Control.Invoke方法,子线程调用的方法立马就变成了主线程,我试过将Control.Invoke赋值为一个委托,然后再调用委托的BeginInvoke,还是不行,我也不想使用设置Form的一个属性就能进行子线程访问多线程的方法,毕竟不太安全,谁能帮我想一下别的解决方案?

微澜的主页 微澜 | 初学一级 | 园豆:-1
提问于:2013-01-06 11:29
< >
分享
最佳答案
0

可以参考http://hi.baidu.com/yyq745201/item/1441d2dc4aff18f292a97423

里面说到的方法一:在拥有该控件的主窗体的构造函数中添加CheckForIllegalCrossThreadCalls = false;这样可能允许你在非控件创建线程上执行控件成员。

 

至于调用Control.BeginInvoke他是会回到主线程执行的,他将消息异步插入到控件的消息队列,待控件创建线程(主线程)进行执行。

奖励园豆:5
滴答的雨 | 老鸟四级 |园豆:3660 | 2013-01-06 11:45
其他回答(2)
0

只要我用Control.Invoke方法,子线程调用的方法立马就变成了主线程

要的就是这个结果,因为访问UI控件被要求只能在主线程中执行,也就是说访问UI控件只能在主线程中。

Launcher | 园豆:45050 (高人七级) | 2013-01-06 11:33

....可是子线程确实有一些比较耗时的操作,而且确实要访问UI控件的数据,有没有解决方案?

支持(0) 反对(0) 微澜 | 园豆:-1 (初学一级) | 2013-01-06 11:40

@微澜: 一步一步来,先把从UI读取或写入数据的代码和处理这些数据的代码分开来,然后在子线程中执行数据处理的逻辑,完成后再在主线程中访问控件。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2013-01-06 11:43
0

CheckForIllegalCrossThreadCalls = false

这个最实用了

chenping2008 | 园豆:9836 (大侠五级) | 2013-01-06 14:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册