2009-10-14 67 views
1

您不能从未创建的线程访问gui控件,至少可以这样说出在执行时有时会引发的异常消息。在非gui线程上创建表单

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

(*)嗯,老实说我已经看到了一个问题,即开放标准的打开文件对话框挡住一切

回答

1

的限制是,与任何UI元素的交互必须发生在创建它的胎面。这并不意味着你不能在后台线程上创建表单。但是,所有与之相关的交互必须发生在该后台线程上。只要你确保这样做(通过根据需要使用InvokeRequiredInvoke),你可以继续并做到这一点。

我在blog post我做了一个这样做的样本,我刚才做了。

0

我没有看到任何问题的原因是因为只有启用它才引发异常。 Control上有一个名为CheckForIllegalCrossThreadCalls的静态属性,默认为False。该文档说:

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