在尝试的 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 以避免干扰调试会话。
解析度
遵循关于 STA 消息泵送的 COM 规则。
要避免出现这些错误弹出窗口,请从 Visual Studio 窗口的“调试”菜单中选择“异常”,然后在“异常对话框”中选择“托管调试助手异常节点”。然后选择 ContextSwitchDeadlock 并从 Thrown 列中删除选择。
如何快速执行:
有很多方法可以做到这一点
在表上创建缺失的索引。
在此表上创建索引视图。
您还可以根据数据范围对表进行分区。
将此表放在其他磁盘上,以便数据读取/写入会很快。