C#Winforms应用程序挂起,而不是引发异常

昨天我遇到了一个非常奇怪的错误,经过一天的努力,我几乎没有取得任何进展,因此我认为这是询问社区的一个不错的选择。我会要求一些耐心的原因,因为我认为这是一个尽管如此。

我有一个C#Winforms应用程序,在生产环境中单击几次后挂起。只有在生产环境中,开发环境才不会发生这种情况。当挂起发生时,什么也没有发生(没有错误消息,但是根据任务管理器,任务进入“不响应”状态),但是GUI变得没有响应。我在相同的环境上尝试过,我可以确认行为。

不幸的是,无法在prod env中安装开发工具和调试应用程序。我能做的最好的事情就是在应用程序停止时进行内存转储。问题是我完全不了解崩溃转储中看到的内容:我的主线程(GUI线程)似乎卡在一条指令中,而我找不到任何原因。

这是我的主线程的堆栈跟踪:

KERNELBASE.dll!_RaiseException@16()  + 0x54 bytes    
[External Code]    
CFAPControlLibrary.dll!CFAPControlLibrary.Communication.Base.GetSetting(string settingName) Line 850 + 0x10 bytes    C#
CFAPControlLibrary.dll!CFAPControlLibrary.ConfigHelper.Get<CFAPControlLibrary.DataTypes.ActionSortingOption>(string settingName) Line 25 + 0x35 bytes    C#
CFAPControlLibrary.dll!CFAPControlLibrary.ConfigHelper.Get<CFAPControlLibrary.DataTypes.ActionSortingOption>(string settingName, CFAPControlLibrary.DataTypes.ActionSortingOption defaultVal) Line 15 + 0x9 bytes    C#    CFAPControlLibrary.dll!CFAPControlLibrary.DataTypes.ActionStorage.Sort(System.Collections.Generic.List<CFAPControlLibrary.DataTypes.ActionClass> subject) Line 167 + 0xe bytes    C#
CFAPControlLibrary.dll!CFAPControlLibrary.DataTypes.ActionStorage.GetByStatus(string pStatus) Line 162 + 0x46 bytes    C#
CFAPControlLibrary.dll!CFAPControlLibrary.ActionSelector.FillNodes() Line 48 + 0x26 bytes    C#
CFAPControlLibrary.dll!CFAPControlLibrary.CFAPMain.OnActionDetailsArrived(CFAPControlLibrary.CFAPMain.RawActionDetails bwr) Line 371 + 0x10 bytes    C#
CFAPControlLibrary.dll!CFAPControlLibrary.CFAPMain.OnGetDetailsCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) Line 337 + 0xb bytes    C#
user32.dll!_InternalCallWinProc@20()  + 0x23 bytes    
user32.dll!_UserCallWinProcCheckWow@32()  + 0xb3 bytes    
user32.dll!_DispatchMessageWorker@8()  + 0xe6 bytes    
user32.dll!_DispatchMessageW@4()  + 0xf bytes    
[External Code]    
CFAPHost.exe!CFAPHost.Program.Main(string[] args) Line 50 + 0x1d bytes    C#
[External Code]    
mscoreei.dll!__CorExeMain@0()  + 0x38 bytes    
mscoree.dll!_ShellShim__CorExeMain@0()  + 0x227 bytes    
mscoree.dll!__CorExeMain_Exported@0()  + 0x8 bytes    
kernel32.dll!@BaseThreadInitThunk@12()  + 0x12 bytes    
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes    
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes

这是我最上层堆栈框架的源代码:从KernelBase.dll的反汇编: 来自KernelBase.dll的框架

比我代码中的最后一帧,m_SettingCache是​​一个Dictionary,它不包含请求的密钥: Base.GetSetting

接下来的几帧: 来自KernelBase.dll的框架 来自KernelBase.dll的框架 来自KernelBase.dll的框架

我认为代码非常简单明了,它只是带有默认值的通用设置。如果出现问题(设置名称未定义或无法转换),将返回默认值。该代码肯定有效。我从转储中看到的是,从字典中读取的内容永远不会返回,尽管它应该抛出KeyNotFoundException,但这种情况永远不会发生。有什么建议么?

注意:主线程确实在转储捕获的状态下停止:每次我进行转储的结果都是相同的。

注意2:挂起永远不会在第一次执行此代码路径时发生,在每种情况下,该代码路径都是在挂起之前执行的(从应用程序日志推导出)

我将根据要求提供更多详细信息。提前致谢。

编辑:

CFAPControlLibrary.dll是应用程序的主要程序集。它包含Windows窗体及其相应的逻辑。使用WCF可以实现与服务器的通信。更大的请求是使用BackgroundWorker在paralell线程中提出的。您在调用堆栈中看到的执行路径由此类BackgroundWorker的完成事件调用。

我在这里粘贴了要求的代码位

我的AppDomain.CurrentDomain.UnhandledException处理程序在这里

我首先认为栈的一部分是无关紧要的,但后来证明是很重要的(从图像中删除了敏感的字符串文字):

申请运行证明 这表明Application.Run被调用,我不知道为什么它没有显示在调用堆栈中。

更新资料

在花了三天时间没有找到问题的原因之后,我决定尝试一种解决方法。由于内存转储表明应用程序总是挂在同一点:应该抛出KeyNotFound异常。最直接的解决方法是重构该代码以尽可能不抛出。该版本通过了测试,从未挂起。这根本不是一个解决方案,但我们不能再花时间在此上。因此,基本上我会用手指交付代码,并希望以后再也不会看到这种崩溃。

谢谢你的建议

汉斯·帕桑特
user32.dll!_DispatchMessageW@4()  + 0xf bytes    
[External Code]    
CFAPHost.exe!CFAPHost.Program.Main(string[] args) Line 50 + 0x1d bytes    C#

改写。堆栈跟踪的这一部分存在严重错误。Main()方法应始终调用Application.Run()以开始启动消息循环。或者应该存在ShowDialog()调用,这是可以分派消息的两种常规方法。都不存在,但是无论如何都会调用DispatchMessage()winapi函数。

还有一种非常晦涩的方式可以将消息发送到CLR中。当应用程序在[STAThread]上使用lock语句时(例如GUI应用程序的主线程),就会发生这种情况或WaitHandle.WaitOne()或Thread.Join(),这是其他阻塞的常用方法。阻塞STA线程是非法的,因为它很可能导致死锁,因此CLR会避免发生麻烦。执行此操作的代码将隐藏在[外部代码]部分中。

在发布的代码中肯定有证据表明,它在非常不合适的地方使用了锁定在UI代码中使用锁定永远是不正确的。

然后,还可以轻松地解释在应用程序崩溃时看到死锁的情况。

这是代码中的一个严重的结构性问题,您需要对其进行修复。从Main()方法开始,这很早就出错了。只需查看调用堆栈,即可轻松检查开发机器。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#Winforms应用程序挂起,而不是引发异常

来自分类Dev

将c#Winforms应用程序转换为Java

来自分类Dev

C#WinForms应用程序中的应用程序范围内的消息处理程序

来自分类Dev

如何在C#Winforms应用程序中显示chm文件

来自分类Dev

从模板向C#WinForms应用程序添加新选项卡?

来自分类Dev

拖放在C#Winforms应用程序中不起作用

来自分类Dev

C#WinForms Tray应用程序-无法捕获Windows关闭事件

来自分类Dev

C#winforms应用程序的下一步是什么?

来自分类Dev

C#Winforms应用程序中的总进程内存使用情况的矛盾报告

来自分类Dev

如何将Bing Maps组件添加到C#Winforms应用程序?

来自分类Dev

如何在.NET 4.0 C#WinForms应用程序中播放SWF文件?

来自分类Dev

好的做法是使用线程(c#winforms)来提高矩阵样式应用程序的性能?

来自分类Dev

在终止之前,确保c#winforms应用程序调用特定功能

来自分类Dev

适用于应用程序教程的C#Winforms控件

来自分类Dev

如果通过Wscript.shell调用的外部应用程序引发异常,则PHP脚本将挂起

来自分类Dev

WSGI应用程序引发了异常

来自分类Dev

程序在引发异常时挂起

来自分类Dev

如何在C#Winforms应用程序中取消长时间运行的异步任务的执行

来自分类Dev

即使是C#winforms应用程序,由于缺少Android SDK也无法构建解决方案吗?

来自分类Dev

C#Move操作挂起,而不是立即引发异常

来自分类Dev

获取早先在应用程序C#中引发的异常?

来自分类Dev

RegionInfo在Windows 8.1应用程序中引发异常

来自分类Dev

引发异常后,应用程序不退出

来自分类Dev

TimeZoneInfo.FindSystemTimeZoneById()在Unity应用程序中引发异常

来自分类Dev

我的应用程序在执行时引发异常

来自分类Dev

引发应用程序异常会导致TransactionalException

来自分类Dev

为什么在我的C#winforms应用程序中第一次HttpClient.PostAsync调用极其慢?

来自分类Dev

WebSphere应用程序挂起

来自分类Dev

如何挂起应用程序?

Related 相关文章

  1. 1

    C#Winforms应用程序挂起,而不是引发异常

  2. 2

    将c#Winforms应用程序转换为Java

  3. 3

    C#WinForms应用程序中的应用程序范围内的消息处理程序

  4. 4

    如何在C#Winforms应用程序中显示chm文件

  5. 5

    从模板向C#WinForms应用程序添加新选项卡?

  6. 6

    拖放在C#Winforms应用程序中不起作用

  7. 7

    C#WinForms Tray应用程序-无法捕获Windows关闭事件

  8. 8

    C#winforms应用程序的下一步是什么?

  9. 9

    C#Winforms应用程序中的总进程内存使用情况的矛盾报告

  10. 10

    如何将Bing Maps组件添加到C#Winforms应用程序?

  11. 11

    如何在.NET 4.0 C#WinForms应用程序中播放SWF文件?

  12. 12

    好的做法是使用线程(c#winforms)来提高矩阵样式应用程序的性能?

  13. 13

    在终止之前,确保c#winforms应用程序调用特定功能

  14. 14

    适用于应用程序教程的C#Winforms控件

  15. 15

    如果通过Wscript.shell调用的外部应用程序引发异常,则PHP脚本将挂起

  16. 16

    WSGI应用程序引发了异常

  17. 17

    程序在引发异常时挂起

  18. 18

    如何在C#Winforms应用程序中取消长时间运行的异步任务的执行

  19. 19

    即使是C#winforms应用程序,由于缺少Android SDK也无法构建解决方案吗?

  20. 20

    C#Move操作挂起,而不是立即引发异常

  21. 21

    获取早先在应用程序C#中引发的异常?

  22. 22

    RegionInfo在Windows 8.1应用程序中引发异常

  23. 23

    引发异常后,应用程序不退出

  24. 24

    TimeZoneInfo.FindSystemTimeZoneById()在Unity应用程序中引发异常

  25. 25

    我的应用程序在执行时引发异常

  26. 26

    引发应用程序异常会导致TransactionalException

  27. 27

    为什么在我的C#winforms应用程序中第一次HttpClient.PostAsync调用极其慢?

  28. 28

    WebSphere应用程序挂起

  29. 29

    如何挂起应用程序?

热门标签

归档