【问题标题】:ContextSwitchDeadlock was detected检测到 ContextSwitchDeadlock
【发布时间】:2012-03-01 17:08:32
【问题描述】:

我在调试模式下运行类似于以下代码:

for (int i = 0; i < 5000; i++)
{
   for (int j = 0; j < 10; j++)
   {
     DoSomething();
   }
}

有时我会从 VS 2010 收到“检测到 ContextSwitchDeadlock”。似乎可用 RAM 减少时性能会下降。我有 8GB 并且能够在大约 8 分钟内运行程序(循环完成后有很多 DB 命中,所以 8 分钟不是循环时间),在 4GB 机器上时间翻了一番!根据我的红色,MDA 被触发,因为我的循环运行时间超过 60 秒。本质上,这是一个代码完全阻塞应用程序的警告。

我可以做些什么来避免这些情况并提高速度?

谢谢!

【问题讨论】:

  • 为了评论提高速度,我们需要查看代码。
  • ...
  • 该代码允许的字符数超过#,所以我不确定如何发布它。
  • 我的意思是更多实际上在“DoSomething()”中的代码,你不能做太多的事情来加速基本的 for 循环,这是在循环中正在做的事情需要时间。 Payo 下面提供的链接是一个很好的建议,这项工作应该在单独的后台工作线程中完成。

标签: c# visual-studio debugging visual-studio-debugging


【解决方案1】:

您可以忽略该异常(对于长时间运行的方法,我已经遇到过这种情况)。

  1. 保持ctrl+alt+e
  2. 点击Find
  3. 输入ContextSwitchDeadlock 并回车
  4. 在表格中取消选中Thrown
  5. OK 关闭Exceptions 配置窗口

【讨论】:

  • 问题是我应该吗?这是减慢或消耗内存的真实情况,还是只是一个可以忽略的例外?如何确定我的问题出在哪里?
  • 这只是视觉工作室警告你一个方法需要很长时间。可以忽略 - 忽略此异常不会影响您的程序,只会影响您的调试体验。如果您的应用程序确实挂起,则需要修复它。另一方面,如果您希望您的应用程序运行很长时间而不会遇到某种类型的“上下文切换”(例如控制台读/写、UI 更新),那么您需要忽略此异常。跨度>
  • 另外,这个问题的回答比我给出的更详细,stackoverflow.com/questions/2797677/…
  • 这就是答案!?!我是stackoverflow的新手,赞成和接受答案会给我一些新手积分:)
  • 我有一个没有 UI 的独立 exe,这是我的问题的答案。
【解决方案2】:

如果您担心速度和性能,为什么不使用 IEnumerator 接口。

【讨论】:

  • 在遍历大集合时,使用 IEnumerator 与 foreach 有真正的优势吗?是在 foreach 中调用 Dispose() 吗?我会尝试一下,看看是否有任何区别。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多