[英]Why is getting a COM+ component through C# interop taking so long?
我使用下面的庫引用我的COM +組件:
using System;
using System.Runtime.InteropServices;
namespace ServiceLib
{
[ClassInterface(0)]
[Guid("9DA56255-697A-11D4-935C-00105AD43C9D")]
[TypeLibType(2)]
public class ServiceClass : IServiceManager, ServiceManager
{
public ServiceClass();
...
}
}
在我的代碼中,我這樣引用它:
ServiceClass serviceClass = new ServiceLib.ServiceClass();
但是,最多可能需要5分鍾才能得到對象。 我的COM +組件是服務包裝器,包裝在Windows服務周圍。 因此,基本上,當某些東西確實創建了COM +引用時,我希望Windows服務能夠為其啟動,但事實並非如此。 也沒有與之關聯的任何.exe進程。 因此,從字面上看,在上一行返回COM +對象之前,在5分鍾內我的系統上什么都沒發生。
看起來問題出在COM +組件的基礎過程很早就死了,並且沒有足夠的時間來抓住它( 要檢查,請在Windows中使用Event Viewer )。 它之所以死亡,是因為多個進程試圖創建對它的引用,而構造函數由於同步問題而失敗,原因是圍繞多個進程試圖獲取它的事實!
編輯:在一個單獨的控制台應用程序中,我測試了該問題,在三個新線程中創建了對該組件的引用, 奇怪的時候我確實看到了該問題,這是圍繞COM +的已知問題,也與多個用戶帳戶的創建有關許多COM +參考 。
再次編輯:在創建對它的任何引用之前,我通過在承載COM +對象的Windows服務上發布服務啟動來解決了所有問題。
最終編輯:真正的問題是COM +對象沒有在其自身上創建適當的單例,並且正在AtlAdvise調用上產生競爭條件...上述解決方案有效,因為它確保不產生競爭條件。 通常,我會創建線程安全代碼。 但是,這不是我的問題,因為我使用的是其他人的API。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.