2010-12-11 209 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調用對於爲服務器創建一個好客家庭至關重要。