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

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

背景:

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)调用这些数据并显示在界面上就没问题了。

<meta http-equiv="refresh" content="600url=本页面url">

这是每十分钟刷新一次页面,呵呵。

你在页面的加载事件中就可以查询数据库了。。。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9620661.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存