我有一些COM對象,我正在.NET應用程序的線程上創建和運行。線程被標記爲Single Threaded Apartments,並且一切似乎都在起作用。我的理解是,如果這些線程試圖從主線程訪問COM對象,那麼這些對象將在.NET中自動被封送和序列化,所以即使在這種情況下,我也會處理這些事情,所有的事情都是安全和整潔的,儘管也許有點慢。在這種情況下是否需要STA消息循環?
我的問題是,雖然事情似乎工作正常,我是而不是在我創建的STA線程中抽取消息循環。如果可以的話,我寧願避免消息循環,因爲它會導致額外的複雜性(以及可能的效率損失)。
我讀過一堆關於爲什麼消息循環是必要的建議(主要來自非常有幫助的Hans Passant),我的理解是消息循環在線程A上給出了一個位置,其中一些其他線程B可以請求居住在線程A上的COM對象可以被封送和播放。如果這是正確的,那麼只要沒有其他線程從線程A上的COM對象請求任何東西,線程A是否安全不抽取消息循環?或者還有其他情況下消息循環可能會發揮作用嗎?
我在這裏玩火嗎?有沒有一種情況下,你問你是否在玩火,而你不是?
您有任何事件?你是否可以控制事件處理程序來確保它們的重新進入調用不會導致無限遞歸?如果您有消息泵,通常會使用發佈消息來打破此循環。 –
我想我不知道與此相關的問題。什麼會導致一個事件發生在我創建並且沒有其他人正在看的線程中?我正在使用的COM對象?據我所知,他們不會引發任何事件... – user12861
如果您的COM對象的設計包括通知外部世界發生了什麼,那麼您可以實現傳出事件接口,如IConnectionPointContainer。 –