什么是';COM上下文';在'中提及;ContextSwitchDeadlock';MDA消息?

什么是';COM上下文';在'中提及;ContextSwitchDeadlock';MDA消息?,com,clr,Com,Clr,在运行单元测试时,我得到如下所示的MDA 在错误消息中,被称为“COM上下文”的十六进制值是什么 我可以为给定的STA线程确定此值吗?如果是,怎么做 托管调试助手 “ContextSwitchDeadlock”检测到 “C:\Program Files\Microsoft”中存在问题 Visual Studio 9.0\Common7\IDE\vstesthost.exe'。其他信息:CLR已 无法从COM转换 上下文0x14cff0到COM上下文 0x14d218持续60秒。线 拥有目的地的人

在运行单元测试时,我得到如下所示的MDA

在错误消息中,被称为“COM上下文”的十六进制值是什么

我可以为给定的STA线程确定此值吗?如果是,怎么做

托管调试助手 “ContextSwitchDeadlock”检测到 “C:\Program Files\Microsoft”中存在问题 Visual Studio 9.0\Common7\IDE\vstesthost.exe'。其他信息:CLR已 无法从COM转换 上下文0x14cff0COM上下文 0x14d218持续60秒。线 拥有目的地的人 上下文/公寓是最有可能的 进行非泵送等待或 处理一个非常长的运行时间 无泵送窗操作 信息。这种情况普遍存在 对绩效产生负面影响,并可能 甚至导致应用程序变得 无响应或内存使用 随着时间的推移不断积累。到 避免这个问题,所有的单 螺纹单元(STA)螺纹 应该使用泵送等待原语 (如CoWaitForMultipleHandles)和 在长时间内定期发送消息 运行操作


我以前没见过,我怀疑这只是一个内部指针。线程ID和线程句柄通常都没有那么大


无法从当前线程获取单元类型,而且我从未在本机代码中看到单元ID(编组时表示源/目标单元的GUID除外)。

单元测试很可能在MTA模式下运行,其中包含显示UI的代码。
一个COM上下文是visual studio,另一个是单元测试中的UI。您既可以不显示UI,也可以关闭MDA。

STA COM应用程序似乎没有旋转消息循环。这会导致STA COM死亡。我不知道COM上下文是什么,但我觉得你应该能够复制你的目标应用程序,让它长时间挂起

听起来好像有一个函数需要超过60秒才能运行。你能把它隔离出来吗

编辑这是为.NET编写COM互操作的人

看看他的博客,或者看看他经常光顾的董事会。他写了很多关于COM互操作的东西。在Microsoft的某个板上问这个问题可能会有帮助。

从我所看到的(查看mscorwks反汇编),它是一个从返回的
IObjContext*

基本上,它看起来像是使用
mscorwks中的
IContextCallback::ContextCallback()
对调用进行排队!CtxEntry::EnterContextOle32BugAware()
,它依次调用
mscorwks!对象上下文(单元)处理消息后,CtxEntry::EnterContextCallback()
。它们使用CLREvent来表示回调完成。对于STA线程,不泵送消息将导致事件等待超时,从而触发ContextSwitchDeadlock MDA


注意:我没有在调试器下运行此测试,因此无法确认其行为,但这可能相当准确。

单元测试是非GUI的,并且配置为在STA中运行。所讨论的UI可能是测试运行程序本身的,而不是您的代码。当在单元测试中运行资源密集型代码时,我已经看到了MDA的问题,VS希望从连接的进程中得到一个更新,而该进程正忙着回答。我想我知道MDA发生的原因(我做从终结器到STA线程的跨线程COM调用),但我确实想知道MDA错误消息中的神奇数字是否可以用任何方式进行诊断——以防检测到真正的问题。是的,这是一个COM消息循环,在某个地方没有得到服务。但我想知道十六进制数指的是什么,我是否可以用它来诊断。