2010-09-03 76 views
1

跟進this問題的一部分,有一個工作線程在DLL中調用COM過程,以異步執行此操作以便工作線程在此調用中不被阻塞的最佳方法是什麼?異步COM C++調用

請注意,調用此COM DLL可能需要很長時間,因爲它將執行數據庫訪問並可能運行長時間運行的查詢。

我想知道在這種情況下是否可能存在異步,或者是否需要等待呼叫完成?

回答

1

這一點,在一般情況下,是不可能的。 COM負責處理COM服務器的線程要求。它在註冊表中廣告。使用Regedit.exe查看並查找您使用的coclass的HKCR \ CLSID {guid}鍵。 ThreadingModel鍵說明需要什麼。

如果它丟失或設置爲Apartment,則服務器說它需要在STA線程上創建,並且它的接口方法必須從該同一線程調用。如果你從另一個線程調用一個方法,那麼這個調用將被編組到STA線程。這很安全,但速度很慢,並且沒有任何併發​​性。

如果它被設置爲Both,那麼當在STA線程上創建COM對象時,調用仍然是封送處理。但不是當它在MTA線程上創建時。只有免費允許免費線程。很少見,絕大多數COM組件都是單元線程的,並且沒有從工作線程調用所需的內部保護。

程序中通常只有一個STA線程,即啓動線程。它必須抽取一個消息循環,這是對STA的一個硬性要求。如果你沒有,COM將創建一個STA線程,以便爲服務器找到一個好的主頁。所有的呼叫都會被封送。

不好消息,我敢肯定,線程中沒有免費的午餐。

+0

那麼你的意思是我不能從工作者線程進行COM調用,或者我不能進行COM調用異步? – 2010-09-03 14:20:59

+0

您*可以*從工作線程發起COM調用。它只是不會在該線程上執行。它不會是異步的,你的線程將被阻塞一段時間直到通話完成。 – 2010-09-03 14:23:35