gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:51:31 28 4
gpt4 key购买 nike

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

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

System.Threading.ThreadStateException: Current thread must be set to single thread apartment (STA) mode before OLE calls can be made. Ensure that your Main function has STAThreadAttribute marked on it.



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

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

最佳答案

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

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

  • 派生自 System.Windows.Forms.Control
  • 派生自 UIElement
  • 关于winforms - 使用反射来确定对象是否需要在 GUI 线程上调用其成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10125465/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com