参考这个 FsEye 问题,我如何使用反射来确定对象是否需要在 GUI 线程上调用其成员(或者如果可能的话,实际上是特定成员)?
场景是这样的:用户在 FSI 中创建 WebBrowser
对象的实例(运行自己的 WinForms 事件循环),然后尝试在 FsEye 中扩展节点。但这会导致一个未经处理的异常对话框警告
System.Threading.ThreadStateException:当前线程必须设置为 可以进行 OLE 调用之前的单线程单元 (STA) 模式。 确保 Main 函数上标记了 STAThreadAttribute。
(具体而言,仅在加载 AccessibilityObject 属性时会发生这种情况)。
我知道这是因为 FsEye 使用 F# 异步计算表达式和 Async.Parallel
延迟、异步和并行加载子节点,因此从非原始、非 STA(即不是原始 FSI GUI 线程)线程池线程调用此 OLE 对象的成员。我也知道如何通过在异步表达式中切换到 GUI 线程上下文来解决此问题,但我只想在绝对必要时这样做。
没有单个成员可以查看来确定是否需要从应用程序的 STA/主线程调用对象。 这只是单个类型的合同中固有的东西
话虽如此,您可以寻找某些线索。 这些将指示对象是 UI 绑定组件,但这绝不是确定的列表
- 派生自 System.Windows.Forms.Control
- 来源于UIElement