gpt4 book ai didi

c# - 另一个C#死锁调试问题

转载 作者:太空宇宙 更新时间:2023-11-03 18:46:59 27 4
gpt4 key购买 nike

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

该应用程序没有响应,尽管当其他窗口拖动到应用程序前面并在其上时会重新绘制自身,但GUI似乎仍被锁定...有趣的是(与GUI线程使用了相当长的时间不同) )“关闭”,“最大化”和“最小化”按钮也没有响应,并且单击时在应用程序的标题中没有显示一点(无响应...)文本,即Windows似乎仍然认为它运行良好。

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

运行的3个线程是:

  • 主/GUI线程
  • 无限循环的线程
  • 无限循环的线程

  • 如果我进入线程2和3,它们似乎正确循环。它们不共享锁(即使与主GUI线程共享),并且根本不使用GUI线程。但是,当进入主/GUI线程时,它在Application.Run上已损坏。

    这个问题使我感到僵局,但是我不知道是不是僵局,为什么我看不到主线程/GUI线程所挂的那行代码?

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

    干杯,

    o

    ------------------------------------------------- - - 解决方案 - - - - - - - - - - - - - - - - - - - - - - - -----

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

    但是,我遇到的总体问题确实是死锁。在获得调用堆栈并将其上半部分弹出到Google之后,我碰到了这一点,它确切地解释了我正在经历的事情...

    http://timl.net/

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

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

    这确定了我正在从GUI线程构造的控件。但是我确实知道这一点,并且可以正确地编码调用,但是我没有意识到的是,该控件在幕后订阅了一个事件或一组事件,这些事件在例如Windows session 已解锁或屏幕保护程序退出。这些调用始终在main/UI线程上进行,并且在看到调用是在错误的线程上进行时被阻止。金在这里详细解释...

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

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

    看来已经解决了问题,该应用程序不再挂起。我希望这对遇到类似问题的人有所帮助。

    再次感谢这里的每个人提供的帮助! (间接地,我上面提到过的令人愉快的博客作者!)

    o

    ------------------------------------------------- ----解决方案II -------------------------------------------- ------

    线程问题不是令人愉快的...您认为您已经解决了该问题,并且下线一个月后,它又重新弹出。我仍然认为上述解决方案可以解决可能引起类似行为的问题,但是我们再次遇到了问题。

    当我们花了一些时间调试它时,我想我会用(希望的)最终解决方案来更新此问题:

    该问题似乎是WinForms 2010.1发行版中的Infragistics组件中的一个错误(没有即时修复)。我们从出现冻结问题的那一刻起就一直在运行(但也添加了很多其他东西)。升级到WinForms 2010.3后,我们尚未重现该问题(deja vu)。在这里查看我的问题以获取更多信息:' .NET 4.0 and the dreaded OnUserPreferenceChanged Hang'。汉斯对一般性问题作了很好的总结。

    我希望这能为围绕有营养的OnUserPreferenceChanged挂起(或任何您想调用的挂起)的建议/信息添加一些内容。

    干杯,

    o

    最佳答案

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

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

    但是,如果您使用的是VS2010,则不是真正的问题。

    关于c# - 另一个C#死锁调试问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3523123/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com