C# 非常奇怪-读取'dynamic'COM对象时线程挂起';s简单性质
我有一个非常奇怪的情况,我以前从未见过这样的事情 我正在使用第三方应用程序的COM接口,与程序进行通信。它是进程内COM服务器。我使用动态类型来访问目标应用程序的对象模型C# 非常奇怪-读取'dynamic'COM对象时线程挂起';s简单性质,c#,c#-4.0,com,C#,C# 4.0,Com,我有一个非常奇怪的情况,我以前从未见过这样的事情 我正在使用第三方应用程序的COM接口,与程序进行通信。它是进程内COM服务器。我使用动态类型来访问目标应用程序的对象模型 dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId")); 我使用该app对象来获取应用程序的其他动态对象。其中一个对象表示相当大的数组,其元素具有许多属性。我遍历这个数组的所有元素,并读取它们的所有属性,也就是说,我在一个大循环
dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));
我使用该app
对象来获取应用程序的其他动态
对象。其中一个对象表示相当大的数组,其元素具有许多属性。我遍历这个数组的所有元素,并读取它们的所有属性,也就是说,我在一个大循环中解析所述对象(执行几分钟)
问题如下:有时,比如说每十次尝试一次,线程在读取其中一个属性时只是“挂起”(每次都不同):
我使用后台工作者来完成这项工作,它只是挂在上面的作业上。快速注意:上面的语句是一行简化,实际上我一次访问一个级别的对象(“每个语句中只有一个点”),因此它实际上是挂起的,需要读取SomeStringProperty
属性。不会抛出异常或任何东西,只是无限期地挂起。我注意到线程“”(0x1240)以代码0(0x0)退出。
消息就在这之前发布在调试器的输出窗口中,因此我相信一些线程会意外终止(尽管没有记录异常!)。当我中断调试时,调用堆栈实际上是无用的,因为它在这种情况下的使用非常有限(在COM对象内部)
我不知道为什么会这样,甚至不知道这是怎么可能的。读取简单字符串属性会导致永久挂起。你有什么想法吗?。据透露,COM服务器已注册为支持MTA,但实际上仅为STA模式设计。该框架假设可以在MTA模式下使用它(因为注册表中相应的注册项声明MTA受支持),并且可能定期创建一些后台线程,从而导致异常。将线程模式设置为STA,或将注册表中COM服务器的参数更改为仅报告STA,解决了这个神秘的随机崩溃问题。死锁是线程中非常常见的故障模式。如果您无法调试它,那么您显然需要组件供应商或作者的帮助。您是否在实例化COM包装的同一线程上访问它的属性?它在什么公寓里?我的怀疑指向COM封送问题……是的,所有这些都在同一个线程中,从开始到结束整个过程都是在后台工作人员中完成的。
string someString = app.SomeArrayObject.Get(i).SomeStringProperty;