簡體   English   中英

為什么通過C#互操作獲取COM +組件會花費這么長時間?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM