又一个C#死锁调试问题

我使用VS2010 Professional在C#中构建了一个multithreading应用程序。 这是一个相当大的应用程序,我们之前已经经历过分类GUI交叉线程和死锁问题,但在过去的一个月里,我们注意到当它闲置大约20-30分钟时似乎锁定了。

该应用程序是无响应的,虽然当其他窗口被拖到应用程序前面并在其上面时它会重新绘制,但GUI似乎仍然被锁定… …(如果GUI线程被使用了相当长的时间) )关闭,最大化和最小化按钮也是无响应的,当点击时,应用程序的标题中不显示小(无响应…)文本,即Windows仍然认为它运行正常。

如果我使用调试器中断/暂停应用程序,并查看正在运行的线程。 我们的托管代码有3个线程正在运行,还有一些其他工作线程无法显示源代码。

运行的3个线程是:

  1. 主/ GUI线程
  2. 一个无限循环的线程
  3. 一个无限循环的线程

如果我进入线程2和3,它们似乎正在循环。 它们不共享锁(即使使用主GUI线程),它们根本不使用GUI线程。 然而,当进入主/ GUI线程时,它在Application.Run上被破坏了……

这个问题让我感到僵局,但我不明白的是,如果它是死锁,为什么我看不到主/ GUI线程挂起的代码行?

任何帮助将不胜感激! 如果您需要更多信息,请与我们联系…

干杯,

袋鼠

————————————————– – -解 – – – – – – – – – – – – – – – – – – – – – – – —-

好的,所以问题现在解决了。 感谢大家的建议! 非常感激! 我已经标记了解决我最初确定应用程序挂起的主/ UI线程的问题的答案(我没有关闭“启用我的代码”选项)。

然而,我遇到的整体问题确实是死锁。 在获得调用堆栈并将其上半部分弹出到Google之后,我遇到了这个问题,它解释了我正在经历的内容……

http://timl.net/

这引用了调试问题的可爱指南……

http://www.aaronlerch.com/blog/2008/12/15/debugging-ui/

这确定了我正在构建GUI线程的控件。 然而,我确实知道了这一点,并且正确地编组了调用,但是我没有意识到的是,在幕后,Control控制了一个事件或一组事件,例如当Windows会话被解锁或屏幕保护程序退出时。 这些调用总是在主/ UI线程上进行,并且在看到调用是在不正确的线程上时阻塞。 Kim在这里详细解释……

http://krgreenlee.blogspot.com/2007/09/onuserpreferencechanged-hang.html

最后,我找到了一个替代解决方案,它不需要关闭main / UI线程的此Control。

这似乎解决了问题,应用程序不再挂起。 我希望这有助于任何遇到类似问题的人。

再次感谢在座的所有人的帮助! (间接地,我上面引用的令人愉快的博客!)

袋鼠

————————————————– — SOLUTION II ——————————————— —–

不是线程问题令人愉快……你认为你已经解决了它,并且一个月后它再次弹回来。 我仍然认为上面的解决方案解决了导致simillar行为的问题,但我们再次遇到了问题。

我们花了一段时间调试这个,我想我会用我们的(希望)最终解决方案更新这个问题:

问题似乎是WinForms 2010.1发行版中的Infragistics组件中的一个错误(没有热修复)。 我们从冻结问题出现的时候开始运行(但也增加了一些其他的东西)。 升级到WinForms 2010.3后,我们还没有重现这个问题(似曾相识)。 在这里查看我的问题以获取更多信息:’. NET 4.0和可怕的OnUserPreferenceChanged Hang ‘。 汉斯对一般问题作了很好的总结。

我希望这会增加一些关于Nutorious OnUserPreferenceChanged Hang(或任何你想称之为)的建议/信息。

干杯,

袋鼠

检查它在Application.Run挂起的位置; 在调试器选项中禁用“仅我的代码”,然后查看调用堆栈。

我修复了一个在Application.Run中死锁的应用程序,因为它试图从一个锁定了不同线程的对象中删除一个事件处理程序。 (直到C#4.0编译器,事件处理程序访问器隐式lock(this)

但是,如果您使用的是VS2010,那不是确切的问题。

我会检查以确保在主窗体后面没有启动模式对话框。 如果启动对话框并且某些事件导致主窗体窃取后焦点,则会发生这种情况。 您可以通过确保模式对话框在创建时将主窗体作为其所有者来避免这种情况。