你不能从他们没有创建的线程中访问gui控件,至少这样说的是当你这样做时有时会引发异常的消息。
最近我看到在后台线程上创建的表单工作得很好,我很困惑。我的心理模型是UI输入启动的所有操作都在GUI线程上处理。单击这样一个表单上的按钮应该引发可怕的异常(表单及其所有控件都是在后台线程而不是gui线程上创建的),但事实并非如此。我的地图出了点问题。
(*)老实说我见过一个打开标准打开文件对话框阻塞所有内容的问题
答案 0 :(得分:1)
限制是与任何UI元素的交互必须在创建它的步骤上发生。这并不意味着您无法在后台线程上创建表单。但是,与之相关的所有交互必须在该后台线程上进行。只要您确保执行此操作(根据需要使用InvokeRequired
和Invoke
),您就可以继续执行此操作。
我在一段时间之前的blog post中有一个这样做的样本。
答案 1 :(得分:0)
我没有看到任何错误的原因是因为只有在启用它时才会引发异常。 Control上有一个名为CheckForIllegalCrossThreadCalls的静态属性,默认为False。医生说:
当控件的创建线程以外的线程尝试访问该控件的某个方法或属性时,通常会导致不可预测的结果。常见的无效线程活动是在错误的线程上调用访问控件的Handle属性。将CheckForIllegalCrossThreadCalls设置为true可以更轻松地查找和诊断此线程活动。