我寫了一個C#程序,與COM服務器進行交談來進行模擬。它的工作原理沒有任何問題,但COM服務器進行的模擬是相當處理器密集型的,只能運行單核。並行連接到同一個COM服務器的多個實例
因此,我用Parallel.For在多個線程之間分配工作負載。然而,似乎COM服務器生成的所有仿真結果都是在其所有類的實例之間共享的,所以當我只用一個線程運行並行任務時,一切都按預期工作,但是當我運行任務有多個線程,結果是完全亂碼的(因爲多個線程正在有效地導致仿真引擎在讀取時將其結果替換爲新結果)。
我想知道是否有多種方式連接到COM服務器多次,以停止類實例的結果共享?
編輯
我連接到COM服務器進程是:
- 使用項目 - >添加引用 - > COM(VS2010)
使用添加參考以下實例化模擬器對象的代碼:
dss = new OpenDSSengine.DSS(); dss.Start(0);
上述代碼在本地線程數據初始化程序(localInit)參數Parallel.For中調用,因此會爲每個線程創建一個新的dss
對象,但獲得的結果似乎在所有線程中都是通用的。
COM服務器是一個DLL。
顯然你的COM服務器不是線程安全的。當您多次使用* new *時,您已經獲得了多個實例,但仍然不是線程安全的,這非常常見。例如,那些實例可能共享全局變量。沒有什麼神奇的公式來解決這個問題,在自己的進程中運行每個實例並與之交談,比如說WCF可以工作。痛苦。 –
你確定這是一個多線程的COM服務器(即不在STA中運行)嗎?什麼阻止你創建COM服務器的多個實例(COM服務器是一個對象,而不是一個進程)?它是一個超出proc服務器(.exe)或in-proc(dll)嗎?你如何獲得COM對象?它可能是單身COM服務器(例如,通過使用DECLARE_CLASSFACTORY_SINGLETON)。請提供更多信息 –
謝謝,相應地添加了以上評論。 @ZdeslavVojkovic,創建COM服務器的多個實例的想法聽起來像它會工作,但我還沒有找到一種方法來使用上述方法來做到這一點。如何做到這一點? –