线程间操作无效,显示:从不是创建控件"Form1"的线程访问它,是什么原因?

 我来答
一篮子阳春白雪
推荐于2019-09-05 · 知道合伙人生活技巧行家
一篮子阳春白雪
知道合伙人生活技巧行家
采纳数:77 获赞数:4789
中学高级教师,有三十年的教学经验,喜舞文弄墨,发表散文、杂文、随笔多篇。

向TA提问 私信TA
展开全部

背景:
winform(vs2010)前台界面上有2个group(group1,group2),
每个group上面有一些lable用于显示后台查询出来的数据,后台3个线程A,B,C
A线程每隔几秒查询数据库,并把查询出来的数据更新到group1上的lable上(定义),
B线程每隔几秒查询数据库,并把查询出来的数据更新到group2上的lable上,通过一个辅助线程计算出的一个值赋给textBox1.text;

1.直接在窗体的构造函数中添加:

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;

此时禁用了所有的控件合法性检查。

2.通过代理来解决(msdn)

private delegate void SetTextCallback(string text); //在给textBox1.text赋值的地方调用以下方法即可 private void SetText(string text) { // InvokeRequired需要比较调用线程ID和创建线程ID // 如果它们不相同则返回true if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.textBox1.Text = text; } }

这里主要用到了.NET中的 delegate。

另外如果线程AB只负责将数据保存在全局变量里,用一个有操作权限的C(主界面搞个timer)调用这些数据并显示在界面上就没问题了。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式