在非gui线程上创建表单

时间:2009-10-14 17:25:47

标签: winforms

你不能从他们没有创建的线程中访问gui控件,至少这样说的是当你这样做时有时会引发异常的消息。

最近我看到在后台线程上创建的表单工作得很好,我很困惑。我的心理模型是UI输入启动的所有操作都在GUI线程上处理。单击这样一个表单上的按钮应该引发可怕的异常(表单及其所有控件都是在后台线程而不是gui线程上创建的),但事实并非如此。我的地图出了点问题。

(*)老实说我见过一个打开标准打开文件对话框阻塞所有内容的问题

2 个答案:

答案 0 :(得分:1)

限制是与任何UI元素的交互必须在创建它的步骤上发生。这并不意味着您无法在后台线程上创建表单。但是,与之相关的所有交互必须在该后台线程上进行。只要您确保执行此操作(根据需要使用InvokeRequiredInvoke),您就可以继续执行此操作。

我在一段时间之前的blog post中有一个这样做的样本。

答案 1 :(得分:0)

我没有看到任何错误的原因是因为只有在启用它时才会引发异常。 Control上有一个名为CheckForIllegalCrossThreadCalls的静态属性,默认为False。医生说:

当控件的创建线程以外的线程尝试访问该控件的某个方法或属性时,通常会导致不可预测的结果。常见的无效线程活动是在错误的线程上调用访问控件的Handle属性。将CheckForIllegalCrossThreadCalls设置为true可以更轻松地查找和诊断此线程活动。