2

我正在使用来自后台线程的 STA COM 对象,当我从处于 STA 线程模式的新线程调用它时,COM 对象的一个​​方法将阻塞,因为 COM 对象的模式是 STA,并且 UI 线程似乎也被阻止了,我可以避免这个 UI 阻止吗?

4

1 回答 1

5

这就是 STA 的重点,COM 会自动将您的工作线程的调用编组到 STA 线程。这样 COM 服务器方法总是以线程安全的方式调用。如果方法阻塞,那也会阻塞你的 STA 线程。通常是 UI 线程。

这意味着在线程中使用这个 COM 对象实际上并没有完成任何事情。对于另一个真正的问题在于 COM 服务器,它不应该是阻塞的。请确保这不是死锁情况。

一种可能的解决方法是在另一个 STA 线程上创建 COM 服务器,这样至少您的 UI 线程不会被阻塞。检查此答案以获取示例代码。Thread.SetApartmentState 和 Application.Run 调用对于为服务器创建一个好客的家都是至关重要的。

于 2010-12-11T15:48:56.070 回答