检测到ContextSwitchDeadlock

3

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

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

我经常在VS 2010中遇到“检测到ContextSwitchDeadlock”的提示。似乎可用的RAM越少性能就会下降。我有8GB内存,能够在约8分钟内运行程序(循环完成后有很多DB hits,所以8分钟不是循环时间),但在4GB机器上需要双倍的时间!根据我的阅读,MDA是因为我的循环运行时间超过了60秒而触发的。实质上,这是一个警告,表示代码完全阻塞了应用程序。

我该怎么做才能避免这些情况并提高速度呢?

谢谢!


为了评论如何提高速度,我们需要看到代码。 - Nanhydrin
<code class="prettyprint">...</code> - Eu Lupu
代码超过了允许的字符数,所以我不确定该如何发布它。 - Eu Lupu
我指的更多是实际在“DoSomething()”内部的代码,你无法做太多来加快基本的for循环,正在循环内部执行的操作需要时间。Payo在下面提供的链接是很好的建议,这项工作应该在单独的后台工作线程中完成。 - Nanhydrin
2个回答

6

您可以忽略那个异常(我曾经遇到过长时间运行方法的情况)。

  1. 按住 ctrl+alt+e
  2. 点击 查找
  3. 输入 ContextSwitchDeadlock 并按 Enter
  4. 在表格中取消选中 已抛出
  5. 通过按下 OK 关闭 异常 配置窗口。

2
问题是我应该吗?这是一个真正会减慢或消耗内存的情况,还是只是可以忽略的异常?我如何确定我的问题所在? - Eu Lupu
这只是Visual Studio在警告您某个方法正在花费很长时间。它可以被忽略 - 忽略此异常不会影响您的程序,它只会影响您的调试体验。如果您的应用程序真的挂起了,那么您需要修复它。另一方面,如果您期望您的应用程序长时间运行而不会触发某种类型的“上下文切换”(例如控制台读/写、UI更新),那么您将希望忽略此异常。 - payo
此外,这个问题的回答比我给出的更冗长。https://dev59.com/LnE85IYBdhLWcg3wYikB - payo
1
这是答案吗?我是StackOverflow的新手,如果能得到点赞和被接受的答案,那会给我一些新手积分 :) - payo
我有一个没有用户界面的独立exe文件,这是解决我的问题的答案。👍 - user1853517

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

在遍历大型集合时,使用IEnumerator与foreach是否有真正的优势?在foreach中是否调用Dispose()?我会尝试一下,看看是否有任何区别。谢谢。 - Eu Lupu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接