5

参考这个FsEye 问题,我如何使用反射来确定对象是否需要在 GUI 线程上调用其成员(或者实际上是特定成员,如果可能)?

场景是这样的:用户在 FSI 中创建一个WebBrowser对象的实例(它运行自己的 WinForms 事件循环),然后他们尝试在 FsEye 中展开节点。但这会导致未处理的异常对话框警告

System.Threading.ThreadStateException:当前线程必须设置为单线程单元 (STA) 模式,然后才能进行 OLE 调用。确保您的 Main 函数上标记了 STAThreadAttribute。

(具体而言,这似乎仅在加载 AccessibilityObject 属性时发生)。

我知道这是因为 FsEye使用 F# 异步计算表达式延迟、异步和并行Async.Parallel加载子节点,因此从非原始、非 STA(即不是原始 FSI GUI 线程)线程池调用此 OLE 对象的成员线程。我也知道如何通过在我的异步表达式中切换到 GUI 线程上下文来解决这个问题,但我只想在绝对必要时这样做。

4

1 回答 1

3

您无法查看单个成员来确定是否需要从应用程序的 STA/主线程调用对象。这只是个人类型合同中固有的东西

话虽如此,您可以寻找某些线索。这些将表明一个对象是一个 UI 绑定组件,但绝不是一个明确的列表

  • 派生自 System.Windows.Forms.Control
  • 派生自 UIElement
于 2012-04-12T14:24:45.370 回答