线程间操作无效,显示:从不是创建控件"Form1"的线程访问它,是什么原因?
推荐于2019-09-05 · 知道合伙人生活技巧行家
背景:
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)调用这些数据并显示在界面上就没问题了。