在运行单元测试时,我将得到如下所示的MDA。
在错误消息中,十六进制值被引用为“COM上下文”吗?
我能为给定的STA线程确定这个值吗?如果是这样的话,是怎么做的?
托管调试助手“ContextSwitchDeadlock”检测到'C:\Program \MicrosoftVisualStudio9.0\Common7\IDE\vstesthost.exe‘中存在问题。附加信息: CLR已60秒无法从COM 上下文0x14cff0转换到COM context 0x14d218。拥有目标上下文/单元的线程很可能要么执行非抽水等待,要么处理非常长时间运行的操作而不发送Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移而不断累积。为了避免这个问题,所有单线程单元(STA)线程都应该使用泵送等待原语(如CoWaitForMultipleHandles),并在长时间运行操作期间常规地对消息进行泵入。
发布于 2009-10-26 07:00:09
根据我所看到的(查看mscorwks反汇编),它是一个IObjContext*,从CoGetContextToken()返回。
基本上,它看起来像是使用来自IContextCallback::ContextCallback()的mscorwks!CtxEntry::EnterContextOle32BugAware()来排队调用,一旦对象上下文(公寓楼)处理消息,后者就会调用mscorwks!CtxEntry::EnterContextCallback()。他们使用CLREvent来发出回调完成的信号。对于STA线程,不抽水消息将导致事件等待超时,从而触发ContextSwitchDeadlock MDA。
注意:我不是在调试器下运行这个程序,所以我无法确认行为,但这可能是相当准确的。
发布于 2009-08-06 07:07:25
我以前没见过,我怀疑这只是一个内部指针。线程ID和线程句柄通常都没有那么大。
没有从当前线程获取公寓类型的方法,我从未在本机代码中看到过单元ID (除了表示编组时的源/目标单元的GUID之外)。
发布于 2009-08-22 05:44:34
单元测试很可能在MTA模式下运行,其中包含显示UI的代码。一个COM上下文是visual studio,另一个是单元测试中的UI。您既可以不显示UI,也可以关闭MDA。
https://stackoverflow.com/questions/1158805
复制相似问题