2011-06-07 100 views
1

假設在STA線程上創建了一個COM對象。所以對這個對象的所有調用都在這個線程中被序列化。所以如果對象的方法被阻塞,所有使用這個對象的線程都被阻塞。STA COM對象的阻塞方法是設計缺陷嗎?

因此,在STA COM對象中使用阻塞方法是需要避免的設計缺陷?

如果COM對象是空閒線程,可以使用阻塞方法嗎?

由於

+0

發生什麼樣的阻塞? WaitForMultipleObjects的? MessageBox的?緊圈? – 2011-06-07 05:55:14

回答

0

是的,在單線程單元對象通過消息同步,並給他們的所有呼叫都以這樣的方式,不超過一個的方法可以在任何這樣的對象上,在任何時刻(被稱爲串行化也沒有方法可以在任何時刻多次調用)。這是爲了達到一定程度的線程安全性而設計的。除非引入僵局,否則長時間運行的方法本身並不是一個大問題。是的,來電者將等到他們的來電輪流進行。

多線程單元中的對象不通過消息進行同步 - 所有對這些對象的調用都是直接完成而沒有同步,因此可以在任何時刻並行調用一個或多個方法在任何對象上,並且它已經啓動以確保線程安全。方法當然可以阻擋內部,但應該注意不要引入僵局。