先生们,我知道这个问题已经被问了很多次,但我仍然找不到一条合理的答复。
我的表单上有超过400个控件。
我有一个后台线程轮询一堆设备并收集各种数据以在表单上显示。
然后我调用一个方法“UpdateDisplay(string [] data)”。 这个程序将在字符串数组data[]中获取所有信息,并填充在表单上的所有组件。 我有标签、文本框被填充。 面板、表格布局和其他控件被显示和隐藏。
数百个组件!!
如果我必须测试每个组件来查看是否需要调用我的程序,那么我的程序将变成50亿行代码!!!
有没有一些简单的方法可以只查看是否需要在UI线程上调用整个UpdateDisplay方法,而不是它所涉及的400多个控件?
我加入了以下代码:
作为display方法中的第一个语句,我不再收到有关从非UI线程调用UI组件的运行时异常。
接下来是update方法的其余部分,其中数百个组件使用data[]中的信息进行更新。
但现在我遇到了一堆System.Forms.dll中的System.InvalidOperationException???
如果我将调试异常选项设置为在所有invalidoperationexceptions上中断,我会看到它们在UpdateDisplay方法中随机抛出,提示从非UI线程更新组件的错误信息。
请问有人能帮我理解并解决这个问题吗?
我可以发布整个UpdateDisplay方法以展示每个组件更新调用都必须包含一个invokerequired if语句是多么荒谬。 不夸张地说,这将每个控件增加三行代码,或者大约1200行额外的代码! 简直太疯狂了!
我的表单上有超过400个控件。
我有一个后台线程轮询一堆设备并收集各种数据以在表单上显示。
然后我调用一个方法“UpdateDisplay(string [] data)”。 这个程序将在字符串数组data[]中获取所有信息,并填充在表单上的所有组件。 我有标签、文本框被填充。 面板、表格布局和其他控件被显示和隐藏。
数百个组件!!
如果我必须测试每个组件来查看是否需要调用我的程序,那么我的程序将变成50亿行代码!!!
有没有一些简单的方法可以只查看是否需要在UI线程上调用整个UpdateDisplay方法,而不是它所涉及的400多个控件?
我加入了以下代码:
if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(() => UpdateDisplay(data)));
}
作为display方法中的第一个语句,我不再收到有关从非UI线程调用UI组件的运行时异常。
接下来是update方法的其余部分,其中数百个组件使用data[]中的信息进行更新。
但现在我遇到了一堆System.Forms.dll中的System.InvalidOperationException???
如果我将调试异常选项设置为在所有invalidoperationexceptions上中断,我会看到它们在UpdateDisplay方法中随机抛出,提示从非UI线程更新组件的错误信息。
请问有人能帮我理解并解决这个问题吗?
我可以发布整个UpdateDisplay方法以展示每个组件更新调用都必须包含一个invokerequired if语句是多么荒谬。 不夸张地说,这将每个控件增加三行代码,或者大约1200行额外的代码! 简直太疯狂了!
BeginInvoke
之后缺少了return
吗?BeginInvoke
将委托安排在UI线程上执行,但如果您确实在if
之后有更多逻辑,则仍将在工作线程上运行。 - Dark FalconInvokeRequired
?你确定你正在后台线程上运行UpdateDisplay
吗? - Yacoub Massad