我一直收到一条我无法解决的错误消息。它起源于Visual或调试器。我不确定最终的错误条件是在VS、调试器、我的程序还是数据库中。
这是一个Windows应用程序。不是网络应用。
来自VS的第一条消息是一个弹出框,上面写着:“没有为任何调用堆栈帧加载符号。源代码无法显示。”当点击时,我得到:"ContextSwitchDeadlock被检测到“,以及下面的一条长消息。
错误出现在扫描DataTable的循环中。对于每一行,它都使用表中的键(HIC #)值作为SqlCommand的参数。该命令用于创建一个返回一行的SqlDataReader。数据比较。如果检测到错误,则将行添加到第二个DataTable中。
该错误似乎与运行过程所需的时间(即60秒后)有关,而与发现多少错误有关。我不认为这是记忆问题。循环中不声明变量。创建的唯一对象是SqlDataReaders,它们正在使用结构。添加System.GC.Collect()没有任何效果。
db是同一台膝上型计算机上的SqlServer站点。
表单上没有花哨的小玩意或小玩意。
我不知道在这个过程中有什么东西,这与我以前做过几十次有很大的不同。我以前见过这个错误,但从来没有前后一致。
有什么主意吗有人吗?
完全错误文本:无法从COM上下文0x1a0b88转换到COM上下文0x1a0cf8 60秒。拥有目标上下文/单元的线程很可能要么执行非抽水等待,要么处理非常长时间运行的操作而不发送Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移而不断累积。为了避免这个问题,所有单线程单元(STA)线程都应该使用泵送等待原语(如CoWaitForMultipleHandles),并在长时间运行操作期间常规地对消息进行泵入。
发布于 2009-02-23 17:07:18
ContextSwitchDeadlock并不一定意味着您的代码存在问题,只是存在一个潜在的问题。如果您转到菜单中的Debug > Exceptions并展开Managed Debugging Assistants,您将发现ContextSwitchDeadlock已启用。
如果禁用此功能,当项目需要很长时间处理时,VS将不再警告您。在某些情况下,您可以有效地进行长期运行的操作。如果您正在调试并在处理过程中停止运行,这也是很有帮助的--在您有机会深入研究问题之前,您不希望它抱怨。
发布于 2019-03-07 16:43:05
在Visual 2017中,通过以下方法未选中ContextSwitchDeadlock选项:
调试> Windows >异常设置

在异常设置中Windows:取消选中ContextSwitchDeadlock选项

发布于 2009-03-04 22:41:06
正如Pedro所说,如果您正在执行代码,那么调试器会阻止消息泵。
但是,如果在UI线程上执行长时间运行操作,则调用Application.DoEvents(),它显式地泵出消息队列,然后将控制返回到当前方法。
但是,如果您正在这样做,我建议您查看您的设计,以便您可以在UI线程上执行处理,以便您的UI保持良好和快速。
https://stackoverflow.com/questions/578357
复制相似问题