2010-12-11 211 views
2

我正在使用一个来自背对象线程的STA COM对象,当我从一个处于STA线程模式的新线程调用它以来,COM对象的一个​​方法将会阻塞,因为COM对象的模式是STA,而UI线程似乎也被阻塞,我可以避免这种UI阻塞?STA线程模式线程也会阻塞winform UI线程?

回答

5

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

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

可能的解决方法是在另一个STA线程上创建COM服务器,以便至少不会阻止您的UI线程。查询this answer获取示例代码。 Thread.SetApartmentState和Application.Run调用对于为服务器创建一个好客家庭至关重要。