2009-11-28 96 views
3

我有遺留的COM組件,我的任務是編寫包裝COM的Web服務並啓用併發非阻塞調用。在C#多線程環境中使用遺留COM組件

首先,因爲COM對象本身是無狀態的,所以我決定使用[ThreadStatic]屬性,以便每個線程都有它自己的COM對象實例,以防止使用lock {}語句並啓用實際併發處理,但似乎所有調用仍然同步進行。

我寫了一個測試代碼,它從COM組件中爲{{}循環同步運行一個方法,然後添加第二個線程,但完全相同,但對於COM對象的另一個實例,並且我看不到更改,X不管線程數量多少,調用總是消耗Y倍時間。它就像有一個靜態鎖或什麼...

儘管如此,單獨的進程可以同時處理每一個呼叫真實。什麼阻止單獨的線程行爲相同?

我能做些什麼來啓用COM組件的實際併發調用?

回答

3

COM是線程感知,並將尊重由coclass請求的線程模型。它使用ThreadingModel值在註冊表中發佈它的線程需求。如果它被設置爲「Apartment」(或缺失),COM將確保所有方法調用都是通過爲QI接口返回一個代理來從單線程單元進行的。代理確保將呼叫編組到正確的線程。

您可以作弊並使用您在STA線程中創建coclass時獲得的接口指針,並在不編組的情況下撥打電話。考慮到coclass已經說過它不具備多線程能力,這是不太可能正常工作的。你會隨機腐蝕內部狀態。