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

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


是的,它是一个COM组件,但我不知道如何判断它是否是STA以及影响/解决方案是什么。我对该组件进行了几次调用,但只是长时间运行的那些我注意到UI没有响应。

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

有帮助吗?

解决方案

问题中有COM标记 - 您是否正在调用COM组件?它是STA组件吗?如果是这样,很可能会以某种方式组织回来在UI线程上进行工作。我很乐意承认自己在成为COM专家方面还有很长的路要走,但如果问题就不会让我感到惊讶。

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

其他提示

是的,并且,这是否会发生在所有非托管代码或仅特定组件或API上?如果是特定的那个,那个非托管代码在做什么?

另外,你可以简单地在BackgroundWorker中注释掉你当前的代码(你正在运行RunWorkerAsync ......)并在那里安排一个睡眠。如果你的GUI变得没有响应,那么某些东西是不正确的,否则它就是你所调用的代码,正如Jon指出的那样可能是COM的情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top