参考这个FsEye 问题,我如何使用反射来确定对象是否需要在 GUI 线程上调用其成员(或者实际上是特定成员,如果可能)?
场景是这样的:用户在 FSI 中创建一个WebBrowser
对象的实例(它运行自己的 WinForms 事件循环),然后他们尝试在 FsEye 中展开节点。但这会导致未处理的异常对话框警告
System.Threading.ThreadStateException:当前线程必须设置为单线程单元 (STA) 模式,然后才能进行 OLE 调用。确保您的 Main 函数上标记了 STAThreadAttribute。
(具体而言,这似乎仅在加载 AccessibilityObject 属性时发生)。
我知道这是因为 FsEye使用 F# 异步计算表达式延迟、异步和并行Async.Parallel
加载子节点,因此从非原始、非 STA(即不是原始 FSI GUI 线程)线程池调用此 OLE 对象的成员线程。我也知道如何通过在我的异步表达式中切换到 GUI 线程上下文来解决这个问题,但我只想在绝对必要时这样做。