contextSwitchDeadlock MDA
如果在尝试进行 COM 上下文转换期间检测到一个死锁,则将激活 contextSwitchDeadlock 托管调试助手 (MDA)。
症状
最常见的症状是:从托管代码对非托管 COM 组件的调用未返回任何结果。 另一个症状是内存使用量与时俱增。
原因
原因很可能是单线程单元 (STA) 线程不发送消息。 STA 线程或者等待而且不发送消息,或者执行一个长时间的操作而且不允许发送消息队列。
内存使用与时俱增的原因是:终结器线程尝试对非托管 COM 组件调用 Release 而该组件未返回任何结果。 这会阻止终结器回收其他对象。
默认情况下,Visual Basic 控制台应用程序的主线程的线程模型为 STA。 如果 STA 线程通过公共语言运行时或第三方控件直接或间接使用 COM 互操作性,MDA 将被激活。 若要避免在 Visual Basic 控制台应用程序中激活此 MDA,请将 MTAThreadAttribute 特性应用于 Main 方法或修改应用程序让其发送消息。
当满足以下所有条件时,可能错误地激活此 MDA:
应用程序通过库从 STA 线程直接或间接地创建 COM 组件。
应用程序在调试器中已停止,而用户继续运行应用程序或执行一步操作。
没有启用非托管调试。
若要确定是否错误地激活了 MDA,请禁用所有断点,重新启动应用程序,然后让它可以不间断地运行。 如果没有激活 MDA,则最初的激活很可能是错误的。 在此情况下,请禁用 MDA,以避免干扰调试会话。
注意 |
---|
此 MDA 处于 Visual Studio 2005 和更高版本的默认集合中。当在 Visual Studio 中启用宿主进程时,将无法禁用处于默认集合中的 MDA。宿主进程是默认启用的,因此必须将其显式禁用。有关如何禁用 MDA 的信息,请参见使用托管调试助手诊断错误中的“Enabling and Disabling MDAs”(启用和禁用 MDA)。 |
解决方法
遵循有关 STA 消息发送的 COM 规则。
对运行时的影响
此 MDA 对 CLR 无任何影响。 它只报告有关 COM 上下文的数据。
Output
一条描述当前上下文和目标上下文的消息。
配置
<mdaConfig>
<assistants>
<contextSwitchDeadlock enable="false" />
</assistants>
</mdaConfig>