2010-05-28 26 views

回答

2

觀察到正常的COM公寓線程規則。如果對象是由STA單元中的客戶端創建的,則客戶端線程需要使用編組接口指針或獲取RPC_E_WRONG_THREAD。實際的方法調用將在其STA線程中的服務器上執行,它需要抽取一個消息循環才能工作。序列化執行,不需要鎖定。

如果它住在MTA公寓中,那麼方法調用將在任意RPC工作線程上執行。你需要採取通常的穿線預防措施。

+0

嗯,問題是關於一個out-proc服務器,所以總是會發生封送。我認爲你的答案與進程內服務器更相關,儘管客戶端和服務器的線程配置需要相同以防止編組。 – Timores 2010-05-29 15:42:13

1

線程不會從一個進程跳轉到另一個進程。

COM服務器內部,COM監聽傳入的方法調用,並有一個線程池(特定於此進程)來服務請求。

+0

因此,comm服務器中的代碼必須由開發人員進行線程安全,還是已經由系統照顧? – 2010-05-28 12:17:16

+0

這可以在您的COM服務器中配置:要麼讓COM序列化所有請求,要麼告訴COM您將處理多線程(例如鎖),並且請求不會被序列化。 – Timores 2010-05-29 15:40:32

1

參見Inter-Object CommunicationProxyStub

客戶端總是在某個進程內對象中調用接口 方法。如果 的實際對象是本地或遠程的,則調用 代理對象, 然後調用實際對象的遠程過程 。

那麼實際執行什麼方法? 答案是,每當有一個 調用到一個進程外接口, 每個接口方法被一個代理對象實現 。代理對象總是一個進程內對象,代表被調用的對象執行 。 此代理對象知道 實際對象正在本地或 遠程服務器中運行。

代理對象在某些數據包中打包了 函數參數,並生成對本地或遠程對象的 RPC調用。 數據包由服務器在本地 或遠程計算機上的存根對象 或遠程計算機拾取,該遠程計算機將參數解包爲 ,並調用 該方法的實際實現。 當該函數返回時,存根 將任何out參數和 返回值打包並將其發送回 代理,該代理將其解包並將 返回給原始客戶端。

因此,客戶端和服務器總是互相對話 ,好像所有內容都是 。

相關問題