首页 / C# / C#-从非UI线程更新控件
C#-从非UI线程更新控件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#-从非UI线程更新控件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2182字,纯文字阅读大概需要4分钟。
内容图文
伙计们,我知道这个问题已经被问过很多次了,但是我仍然找不到一个对我有意义的答复.
我有一个表格,上面有400多个控件.
我有一个后台线程,它轮询一堆设备并收集各种要在表单上显示的数据.
然后,我将一种方法称为“ UpdateDisplay(string [] data)”.这个例程获取字符串数组data []中的所有信息,并填写表单上的所有组件.我有Labels,TextBoxes被填充.Panels和TableLayouts以及其他控件正在显示和隐藏.
数百个!
如果我必须测试每个组件,看看是否必须调用我的程序,它将变成50亿行代码!
有什么方法可以简单地查看是否需要在UI线程上调用整个UpdateDisplay方法,而不是它所涉及的所有400个组件?
我输入以下代码:
if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(() => UpdateDisplay(data)));
}
作为display方法中的第一条语句,我不再从非ui线程中获取有关调用ui组件的运行时异常.
其次是其余的更新方法,其中数百个组件使用data []中的信息进行更新
但是现在我在System.Forms.dll中得到了一堆System.InvalidOperationException ???
如果我将debug exception选项设置为对所有invalidoperationexception都无效,那么我会看到在更新DisplayDisplay方法中的组件时会随机抛出这些异常,有关如何从非ui线程更新组件的信息.
有人可以帮我理解和解决此问题吗?
我可以发布整个UpdateDisplay方法,以显示如果我必须用invokevquired if语句包装每个组件更新调用,那么它将多么繁琐.不夸张地说,每个控件将添加三行代码,或大约1200行附加代码!那太疯狂了!
解决方法:
您没有提供足够的代码,但是如果您的方法看起来像这样:
void UpdateDisplay(string[] data)
{
if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(() => UpdateDisplay(data)));
}
Label1.Text = data[0];
// Update more controls here
}
那么您将运行UpdateDisplay两次,一次是由于BeginInvoke在UI线程上运行,一次是在BeginInvoke返回时在工作线程上运行.通常的模式是,如果您使用Invoke或BeginInvoke来调用自己,则该方法将立即返回并且不做进一步处理:
void UpdateDisplay(string[] data)
{
if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(() => UpdateDisplay(data)));
return; // Don't run any code below when BeginInvoke returns
}
Label1.Text = data[0];
// Update more controls here
}
JimmyV还提供了一个备用版本,该版本在BeginInvoke之后也不再起作用:
void UpdateDisplay(string[] data)
{
if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(() => UpdateDisplay(data)));
}
else // Don't run any code below when BeginInvoke returns
{
Label1.Text = data[0];
// Update more controls here
}
}
内容总结
以上是互联网集市为您收集整理的C#-从非UI线程更新控件全部内容,希望文章能够帮你解决C#-从非UI线程更新控件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。