在运行单元测试时,我得到的MDA如下所示。
在错误消息中,十六进制值被称为“COM上下文”是什么?
我可以为给定的STA线程确定此值吗?如果是这样,怎么样?
托管调试助手 'ContextSwitchDeadlock'检测到了一个 'C:\ Program Files \ Microsoft中的问题 视觉工作室 9.0 \ Common7 \ IDE \ vstesthost.exe”。附加信息:CLR有 无法从 COM 转换 上下文0x14cff0 到 COM上下文 0x14d218 持续60秒。线程 拥有目的地 上下文/公寓是最有可能的 或者做一次非抽水等待或者 处理很长时间 没有泵Windows的操作 消息。这种情况一般都有 负面的业绩影响和可能 甚至导致应用程序成为 无响应或内存使用 随着时间的推移不断积累。至 一切都避免这个问题 线程公寓(STA)线程 应该使用抽等待原语 (例如CoWaitForMultipleHandles)和 经常在长时间内发送消息 正在运行。
答案 0 :(得分:2)
从我所看到的(看mscorwks反汇编),它是IObjContext*
,从CoGetContextToken()返回。
基本上看起来,使用来自IContextCallback::ContextCallback()
的{{1}}排队呼叫,一旦对象上下文(公寓)处理消息,它就会调用mscorwks!CtxEntry::EnterContextOle32BugAware()
。他们使用CLREvent来表示回调完成。对于STA线程,不泵送消息会导致事件等待超时,从而触发ContextSwitchDeadlock MDA。
注意:我没有在调试器下运行它,所以我无法确认行为,但这可能相当准确。
答案 1 :(得分:0)
之前我没见过,我怀疑它只是一个内部指针。线程ID和线程句柄通常都不大。
从当前线程中无法获取公寓类型,并且我从未在本机代码中看到过公寓ID(除了代表源/目标公寓的GUID)。
答案 2 :(得分:0)
单元测试很可能在MTA模式下运行,并且您的代码中显示了一个UI。 一个COM上下文是visual studio,另一个是单元测试中的UI。您可以不显示UI或关闭MDA。
答案 3 :(得分:0)
看起来STA COM应用程序不会旋转消息循环。这会导致STA COM死亡。我不知道COM上下文是什么,但它让我觉得你应该能够重现你的目标应用程序只是挂了很长一段时间。
听起来有一个功能需要超过60秒才能运行。你有没能把它隔离开来?
编辑这是为.NET编写COM互操作的人。
http://blogs.msdn.com/cbrumme/
查看他的博客或查看他经常光顾的主板。他写了很多关于为什么COM以它的方式互操作的东西。在其中一个Microsoft主板上提出这个问题可能会有所帮助。