2

我有一个非常奇怪的情况,我以前从未见过这样的事情。

我正在使用第三方应用程序的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 对象内部)它的使用非常有限。

我不知道为什么会这样,也不知道这怎么可能。读取简单字符串属性会导致永久挂起。你有什么想法?..

4

1 回答 1

1

据透露,COM 服务器被注册为支持 MTA,但实际上只为 STA 模式设计。该框架假设可以在 MTA 模式下使用它(因为注册表中的相应注册条目表明支持 MTA),并且可能正在定期创建一些导致异常的后台线程。将线程模式设置为 STA,或者将注册表中的 COM 服务器参数更改为仅报告 STA,解决了这个神秘的随机崩溃问题。

于 2012-10-01T08:56:50.717 回答