【发布时间】:2010-10-09 08:47:09
【问题描述】:
我收到一条我无法解决的错误消息。它源自 Visual Studio 或调试器。我不确定最终的错误情况是在 VS、调试器、我的程序还是数据库中。
这是一个 Windows 应用程序。不是网络应用。
来自 VS 的第一条消息是一个弹出框,上面写着: “没有为任何调用堆栈帧加载任何符号。无法显示源代码。” 当它被点击时,我得到: “检测到 ContextSwitchDeadlock”,以及下面复制的一条长消息。
错误出现在向下扫描 DataTable 的循环中。对于每一行,它使用表中的键 (HIC #) 值作为 SqlCommand 的参数。该命令用于创建返回一行的 SqlDataReader。比较数据。如果检测到错误,则会将一行添加到第二个 DataTable。
错误似乎与程序运行所需的时间(即 60 秒后)有关,而不是发现了多少错误。我不认为这是一个内存问题。循环内没有声明任何变量。创建的唯一对象是 SqlDataReaders,它们位于 Using 结构中。添加 System.GC.Collect() 没有效果。
数据库是同一台笔记本电脑上的 SqlServer 站点。
表单上没有花哨的小玩意或小工具。
我不知道这个过程中有什么与我之前做过的几十次有很大不同的地方。我以前见过这个错误,但从来没有一致的基础。
有什么想法吗?
完整的错误文本: CLR 在 60 秒内无法从 COM 上下文 0x1a0b88 转换到 COM 上下文 0x1a0cf8。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为避免此问题,所有单线程单元 (STA) 线程都应使用泵送等待原语(例如 CoWaitForMultipleHandles)并在长时间运行的操作期间定期泵送消息。
【问题讨论】:
标签: c# sql-server visual-studio