【问题标题】: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 可能就是这种情况。