为什么要获得COM+;组件通过C#互操作需要这么长时间?

为什么要获得COM+;组件通过C#互操作需要这么长时间?,c#,service,interop,com+,C#,Service,Interop,Com+,我使用以下引用COM+组件的库: using System; using System.Runtime.InteropServices; namespace ServiceLib { [ClassInterface(0)] [Guid("9DA56255-697A-11D4-935C-00105AD43C9D")] [TypeLibType(2)] public class ServiceClass : IServiceManager, ServiceManag

我使用以下引用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中的事件查看器)。它死掉的原因是多个进程试图创建对它的引用,而构造函数由于多个进程试图获取它的同步问题而失败

编辑:在我为测试该问题而开发的一个单独的控制台应用程序中,我在三个新线程中创建了对该组件的引用,然后

再次编辑:在创建对COM+对象的任何引用之前,我通过在承载COM+对象的windows服务上发出服务启动命令,解决了所有问题。


最终编辑:真正的问题是COM+对象没有为自己创建一个合适的单例,而是在AtlAdvise调用上生成了一个竞争条件……上面的解决方案是有效的,因为它确保不生成竞争条件。通常我会创建线程安全代码。但遗憾的是,这不是我的问题,因为我使用的是其他人的API。

长时间的延迟通常与网络超时有关。使用中演示的故障排除技术查找根本原因。@HansPassant的所有故障都是局部的。