代码之家  ›  专栏  ›  技术社区  ›  mackenir

“contextswitchdeadlock”mda消息中引用的“com context”是什么?

  •  3
  • mackenir  · 技术社区  · 16 年前

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

    在错误消息中,“com context”所指的十六进制值是什么?

    我可以确定给定STA线程的这个值吗?如果是这样,怎么办?

    托管调试助手 “contextswitchdeadlock”检测到 'C:\Program Files\Microsoft中存在问题 可视演播室 9.0 \common7 \ide \vstesthost.exe'。附加信息:CLR具有 无法从转换 组件对象模型 上下文0x14cff0 COM上下文 0x14D218 60秒。线程 拥有目的地的人 环境/公寓最有可能 进行非泵送等待或 处理非常长的运行时间 无泵送窗口操作 信息。这种情况通常 对性能的负面影响 甚至导致应用程序 无响应或内存使用 随着时间的推移不断积累。到 避免这个问题,所有单一的 螺纹公寓(STA)螺纹 应使用泵送等待原语 (如cowaitformultiplehandles)和 在长时间内定期发送消息 正在运行操作。

    4 回复  |  直到 16 年前
        1
  •  2
  •   Nathan Howell    16 年前

    从我所看到的(看mscorwks的反汇编),它是一个 IObjContext* ,从 CoGetContextToken() .

    基本上,它看起来像是一个电话排队使用 IContextCallback::ContextCallback() mscorwks!CtxEntry::EnterContextOle32BugAware() ,然后调用 mscorwks!CtxEntry::EnterContextCallback() 一旦对象上下文(公寓)处理了消息。他们使用clrevent来表示回调完成。对于STA线程,不泵送消息会导致事件等待超时,从而触发ContextSwitchDeadlock MDA。

    注意:我没有在调试器下运行这个,所以我无法确认行为,但这可能相当准确。

        2
  •  0
  •   Kim Gräsman    16 年前

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

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

        3
  •  0
  •   Joe Caffeine    16 年前

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

        4
  •  0
  •   Igor Zevaka    16 年前

    看起来sta-com应用程序不旋转消息循环。这会导致sta com死亡。我不知道COM上下文是什么,但我突然想到,你应该能够复制你的目标应用程序,以便长时间挂起。

    听起来有一个函数需要60秒以上才能运行。你能隔离它吗?

    编辑 这是为.NET编写com interop的人。

    http://blogs.msdn.com/cbrumme/

    看看他的博客或者看看他经常光顾的网站。他写了很多关于为什么COM以这种方式互操作的东西。在其中一个微软板上问这个问题可能会有所帮助。