在我的 Azure 角色启动代码中,我实例化了一个 DCOM 对象以确保它可以被实例化,然后立即释放它,因为此时我并不真正需要它。
我在一个单独的线程中执行此操作,该线程实际上new
是相应的 C# RCW 类和主线程Thread.Join()
,该线程具有 30 秒的超时。如果线程在返回后仍在运行,Thread.Join()
这意味着 DCOM 对象的创建时间很长,因此Thread.Abort()
被调用并且角色重新启动。30 秒应该足够了 - 对象是轻量级的,并且在实例化时不会做任何耗时的事情。
在我尝试大幅扩展我的服务之前,该代码运行良好。我要求支持取消计算核心配额并尝试扩展到 100(一百)个实例。
现在大多数实例都可以正常启动,但其中一些实例恰好面临上述情况 - DCOM 对象创建时间过长,因此代码抛出异常导致角色重新启动。
我重复了几次测试。一旦我要求扩大几十个实例,问题就会在一些新启动的实例中重现。由于所有实例都是统一的,我不知道是什么导致了这种行为。
仅在某些情况下 DCOM 对象需要这么长时间的原因可能是什么?