我正在使用来自后台线程的STA COM对象,当我从一个处于STA线程模式的新线程调用它时,一个COM对象的方法将阻塞,因为COM对象的模式是STA,并且UI线程似乎也被阻止了,我可以避免这种UI阻塞吗?
答案 0 :(得分:5)
这就是STA的意思,COM会自动封送从你的工作线程到STA线程的调用。这样COM服务器方法总是以线程安全的方式调用。如果方法阻塞,那也会阻塞你的STA线程。通常是UI线程。
这意味着在一个线程中使用这个COM对象实际上并没有完成任何事情。对于另一个真正的问题是在COM服务器中,它不应该阻塞。确保这不是死锁情况。
一种可能的解决方法是在另一个STA线程上创建COM服务器,这样至少不会阻止您的UI线程。检查this answer以获取示例代码。 Thread.SetApartmentState和Application.Run调用对于为服务器创建一个好客的家庭至关重要。