使用反射来确定对象是否需要在GUI线程上调用其成员

Ste*_*sen 5 f# winforms fsi

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

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

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

(具体来说,这似乎只在加载AccessibilityObject属性时发生).

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

Jar*_*Par 3

您可以查看任何单个成员来确定是否需要从应用程序的 STA/主线程调用对象。这只是个体类型契约中固有的东西

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

  • 派生自 System.Windows.Forms.Control
  • 源自 UIElement