我有一个非常奇怪的情况,我以前没见过这样的事情。
我正在使用第三方应用的COM接口与程序进行通信。它是进程内COM服务器。我使用动态类型来访问目标应用程序的对象模型。
dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));
我使用app
对象来获取应用程序的其他dynamic
个对象。其中一个对象代表相当大的数组,其中的元素具有许多属性。我遍历这个数组的所有元素,并读取它们的所有属性,即我在一个大循环中解析所述对象(执行几分钟)。
问题如下:有时候,在十次尝试中说一次,线程在读取其中一个属性时会“挂起”(每次都有不同的属性):
string someString = app.SomeArrayObject.Get(i).SomeStringProperty;
我使用后台工作程序执行此操作,它只是挂起上面的任务。快速说明:上面的语句是单行简化,实际上我一次访问一个对象(“每个语句中只有一个点”),所以它实际上是在读取SomeStringProperty
属性时挂起的。不抛出异常或任何东西,只是无限期地挂起。我注意到在此之前调试器的输出窗口中发布了The thread '<No Name>' (0x1240) has exited with code 0 (0x0).
消息,所以我相信一些线程意外终止(尽管没有记录异常!)。当我打破调试时,调用堆栈实际上是无用的,因为它在这种情况下(在COM对象内部)的使用非常有限。
我不知道为什么会发生这种情况,以及这种情况怎么可能发生。读取简单的字符串属性会导致永久挂起。你有什么想法吗?..
答案 0 :(得分:1)
据透露,COM服务器已注册为支持MTA,但实际上仅针对STA模式设计。该框架假设可以在MTA模式下使用它(因为在注册表中声明了MTA支持相应的注册条目),并且可能是定期创建一些导致异常的后台线程。将线程模式设置为STA,或者在注册表中更改COM服务器的参数以报告仅STA,解决了这个神秘的随机崩溃问题。