Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非常奇怪-读取'dynamic'COM对象时线程挂起';s简单性质_C#_C# 4.0_Com - Fatal编程技术网

C# 非常奇怪-读取'dynamic'COM对象时线程挂起';s简单性质

C# 非常奇怪-读取'dynamic'COM对象时线程挂起';s简单性质,c#,c#-4.0,com,C#,C# 4.0,Com,我有一个非常奇怪的情况,我以前从未见过这样的事情 我正在使用第三方应用程序的COM接口,与程序进行通信。它是进程内COM服务器。我使用动态类型来访问目标应用程序的对象模型 dynamic app = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId")); 我使用该app对象来获取应用程序的其他动态对象。其中一个对象表示相当大的数组,其元素具有许多属性。我遍历这个数组的所有元素,并读取它们的所有属性,也就是说,我在一个大循环

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

我正在使用第三方应用程序的COM接口,与程序进行通信。它是进程内COM服务器。我使用动态类型来访问目标应用程序的对象模型

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;