【问题标题】:Why does a call to unmanaged code from a .NET BackgroundWorker thread affect the UI?为什么从 .NET BackgroundWorker 线程调用非托管代码会影响 UI?
【发布时间】:2008-11-12 07:25:40
【问题描述】:

我在 .NET 2.0 BackgroundWorker 线程中有一系列长时间运行的操作。当我调用位于引用程序集中的非托管代码时,UI 将被冻结,直到调用完成。

这是为什么?我不应该从BackgroundWorker 线程进行这些调用吗?


是的,它是一个 COM 组件,但我不确定如何判断它是否是 STA,以及它的含义/解决方案是什么。我对该组件进行了多次调用,但只有在长时间运行的情况下我注意到 UI 变得无响应。

这些调用从服务器检索数据。

【问题讨论】:

    标签: com backgroundworker unmanaged


    【解决方案1】:

    您在问题中找到了 COM 标记 - 您是在调用 COM 组件吗?它是 STA 组件吗?如果是这样,它很可能会以某种方式编组回去在 UI 线程上完成其工作。我很乐意承认,我距离成为 COM 专家还有很长的路要走,但如果这是问题所在,我不会感到惊讶。

    如果您从明确创建的新线程进行调用会发生什么?

    【讨论】:

      【解决方案2】:

      是的,而且,所有非托管代码或仅特定组件或 API 都会发生这种情况吗?如果是特定的,那非托管代码在做什么?

      【讨论】:

        【解决方案3】:

        此外,您可以简单地在 BackgroundWorker 中注释掉您当前的代码(您正在运行 RunWorkerAsync 正确...)并在那里休眠。如果您的 GUI 变得无响应,则说明某些问题是不正确的,否则就是您调用的代码,正如 Jon 指出的那样,COM 可能就是这种情况。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-24
          • 2012-01-14
          • 2015-02-24
          • 1970-01-01
          相关资源
          最近更新 更多