又一个C#死锁调试问题

时间:2010-08-19 15:03:35

标签: c# multithreading visual-studio-2010 deadlock parallel-processing

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

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

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

运行的3个主题是:

  1. 主/ GUI线程
  2. 无限循环的线程
  3. 无限循环的线程
  4. 如果我进入线程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

    最后,我找到了一个替代解决方案,它不需要在主/ UI线程上使用此控件。

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

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

    小豆

    -------------------------------------------- --------- SOLUTION II --------------------------------------- -----------

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

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

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

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

    干杯,

    小豆

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

检查Application.Run中挂在哪里;在Debugger Options中禁用Just My Code,然后查看调用堆栈。

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

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