我有一个.Net 2.0 C#WinForms应用程序,它在开发中运行良好但偶尔会在生产中冻结。我找了所有常见的罪魁祸首:
1.我使用了InvokeRequired和Invoke来确保没有从错误的线程操纵UI组件
2.我已经在UI线程上同步了所有的计时器对象
3.我已经阅读了这篇关于OnUserPreferenceChanged的文章http://www.ikriv.com/en/prog/info/dotnet/MysteriousHang.html,我确实遇到了这个问题,但我修复了它。
当我们从.Net 1.1迁移到.Net 2+时,这种情况就开始发生了。在此之前,它永远不会挂起。
当发生此问题时,我正在使用托管堆栈资源管理器定期从生产应用程序获取堆栈跟踪,并且主UI线程总是卡在一些新的随机位置。如果这是一个线程死锁,它就不会像WaitOne那样被阻塞。
我的申请做了以下事情:
- 使用多个System.Timers.Timer实例
- 使用WMI管理打印
- 有一些后台线程使Web服务调用服务器,但不与UI交互
- 有一些后台线程使用System.Diagnostics.Process来查看计算机上的其他进程,有时会杀死它们。
- 与使用串口与账单接受者通信的第三方dll进行交互
- 与一些com / activex / ocx控件交互以与信用卡读卡器进行交互。
以下是一次挂起的例子以及当时的所有堆栈跟踪:
Thread ID: 2816
0. System.Threading.WaitHandle.WaitOne (Source Unavailable)
1. System.Threading.WaitHandle.WaitOne (Source Unavailable)
2. System.Threading.WaitHandle.WaitOne (Source Unavailable)
3. System.Management.MTAHelper.WorkerThread (Source Unavailable)
4. System.Threading.ThreadHelper.ThreadStart_Context (Source Unavailable)
5. System.Threading.ExecutionContext.Run (Source Unavailable)
6. System.Threading.ThreadHelper.ThreadStart (Source Unavailable)
Thread ID: 2828
Thread ID: 2852
0. MeiNet.EBDS.BillAcceptor.submitRequestStack (Source Unavailable)
1. MeiNet.EBDS.BillAcceptor.OnHandleEscrowed (Source Unavailable)
2. MeiNet.EBDS.BillAcceptor.EventHandler (Source Unavailable)
Thread ID: 2908
Thread ID: 2820
0. System.Threading.Thread.Sleep (Source Unavailable)
1. MyApp.ProcessKiller.startSpecialKillerLoop (ProcessKiller.cs:115)
2. System.Threading.ThreadHelper.ThreadStart_Context (Source Unavailable)
3. System.Threading.ExecutionContext.Run (Source Unavailable)
4. System.Threading.ThreadHelper.ThreadStart (Source Unavailable)
Thread ID: 2600
Thread ID: 2844
0. System.Threading.Thread.Start (Source Unavailable)
1. System.Net.TimerThread.Prod (Source Unavailable)
2. System.Net.TimerThread.TimerQueue.CreateTimer (Source Unavailable)
3. System.Net.ServicePoint..ctor (Source Unavailable)
4. System.Net.ServicePointManager.FindServicePointHelper (Source Unavailable)
5. System.Net.ServicePointManager.FindServicePoint (Source Unavailable)
6. System.Net.HttpWebRequest.FindServicePoint (Source Unavailable)
7. System.Net.HttpWebRequest.GetRequestStream (Source Unavailable)
8. System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke (Source Unavailable)
9. MyApp.MyServer.Server.hb4 (Reference.cs:588)
10. MyApp.HeartbeatSender.SendThreadedHeartbeat (HeartbeatSender.cs:81)
11. MyApp.HeartbeatSender.StartHeartbeatLoop (HeartbeatSender.cs:40)
12. System.Threading.ThreadHelper.ThreadStart_Context (Source Unavailable)
13. System.Threading.ExecutionContext.Run (Source Unavailable)
14. System.Threading.ThreadHelper.ThreadStart (Source Unavailable)
Thread ID: 2824
0. System.Threading.Thread.Sleep (Source Unavailable)
1. MyApp.OfficeMonitor.StartMonitoring (OfficeMonitor.cs:84)
2. System.Threading.ThreadHelper.ThreadStart_Context (Source Unavailable)
3. System.Threading.ExecutionContext.Run (Source Unavailable)
4. System.Threading.ThreadHelper.ThreadStart (Source Unavailable)
Thread ID: 2584
0. [Internal thisFrame, 'M-->U', System.Windows.Forms.UnsafeNativeMethods::GetModuleHandle] (Source Unavailable)
1. System.Windows.Forms.Application.get_ComCtlSupportsVisualStyles (Source Unavailable)
2. System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintWorker (Source Unavailable)
3. System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintUp (Source Unavailable)
4. System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintOver (Source Unavailable)
5. System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.Paint (Source Unavailable)
6. System.Windows.Forms.ButtonBase.OnPaint (Source Unavailable)
7. System.Windows.Forms.Control.PaintWithErrorHandling (Source Unavailable)
8. System.Windows.Forms.Control.WmPaint (Source Unavailable)
9. System.Windows.Forms.Control.WndProc (Source Unavailable)
10. System.Windows.Forms.ButtonBase.WndProc (Source Unavailable)
11. System.Windows.Forms.Button.WndProc (Source Unavailable)
12. System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Source Unavailable)
13. System.Windows.Forms.Control.ControlNativeWindow.WndProc (Source Unavailable)
14. System.Windows.Forms.NativeWindow.Callback (Source Unavailable)
15. [Internal thisFrame, 'M-->U', System.Windows.Forms.SafeNativeMethods::UpdateWindow] (Source Unavailable)
16. System.Windows.Forms.Control.Update (Source Unavailable)
17. System.Windows.Forms.Control.Refresh (Source Unavailable)
18. MyApp.MainForm.ClearFields (MainForm.cs:4057)
19. MyApp.MainForm.ShowHomeButtons (MainForm.cs:5664)
20. MyApp.MainForm.ShowScreenSaver (MainForm.cs:4284)
21. MyApp.MainForm.ScreensaverTimerTick (MainForm.cs:7817)
22. System.RuntimeMethodHandle.InvokeMethodFast (Source Unavailable)
23. System.Reflection.RuntimeMethodInfo.Invoke (Source Unavailable)
24. System.Delegate.DynamicInvokeImpl (Source Unavailable)
25. System.Windows.Forms.Control.InvokeMarshaledCallbackDo (Source Unavailable)
26. System.Windows.Forms.Control.InvokeMarshaledCallbackHelper (Source Unavailable)
27. System.Threading.ExecutionContext.runTryCode (Source Unavailable)
28. System.Threading.ExecutionContext.RunInternal (Source Unavailable)
29. System.Threading.ExecutionContext.Run (Source Unavailable)
30. System.Windows.Forms.Control.InvokeMarshaledCallback (Source Unavailable)
31. System.Windows.Forms.Control.InvokeMarshaledCallbacks (Source Unavailable)
32. System.Windows.Forms.Control.WndProc (Source Unavailable)
33. System.Windows.Forms.ScrollableControl.WndProc (Source Unavailable)
34. System.Windows.Forms.ContainerControl.WndProc (Source Unavailable)
35. System.Windows.Forms.Form.WndProc (Source Unavailable)
36. System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Source Unavailable)
37. System.Windows.Forms.Control.ControlNativeWindow.WndProc (Source Unavailable)
38. System.Windows.Forms.NativeWindow.Callback (Source Unavailable)
39. [Internal thisFrame, 'M-->U', System.Windows.Forms.UnsafeNativeMethods::DispatchMessageW] (Source Unavailable)
40. System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Source Unavailable)
41. System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner (Source Unavailable)
42. System.Windows.Forms.Application.ThreadContext.RunMessageLoop (Source Unavailable)
43. System.Windows.Forms.Application.Run (Source Unavailable)
44. MyApp.MainForm.Main (MainForm.cs:2975)
关于我应该做什么的任何建议?
答案 0 :(得分:2)
一些想法:
您是否在开发环境中使用生产中不存在的任何预处理程序标志。所以任何#If Debug
或其他。
您是否在发布模式下测试了开发环境?它还没挂?
机器有什么不同?一个人有更多的RAM,一个四核与双核,是一个落后于一百万个防火墙而另一个没有?
在您的线程中,您确定在更新UI元素之前没有任何东西等待回复完成吗?
您使用的是数据库吗?如果是这样,他们是不同的,他们有什么不同?
悬挂是否可能是因为您正在拉StackTraces?
您是否有任何例外情况可能会告诉您正在发生的事情?
机器上的串口有什么不同吗?
是否使用相同的票据接收器?
继续等等。
尝试在新VM上安装它,看看会发生什么。它可能是一些旧的dll或驱动程序,大多数情况下Works on my machine
症状发生时,因为你做了一件你忘了的事情,这使事情有效。
答案 1 :(得分:1)
我们遇到了完全相同的问题,这篇文章(就像你提到的那样)向我们指出了解决方案: http://www.ikriv.com/dev/dotnet/MysteriousHang.html#WhatToDo
我们使用了带有以下代码的启动画面:
ThreadPool.QueueUserWorkItem((x) =>
{
using (var splashForm = new SplashForm())
{
splashForm.Show();
while (!done)
Application.DoEvents();
splashForm.Close();
}
});
我们有幸运气可以重现死锁。我们有一台笔记本电脑/平板电脑,您可以从键盘上拆下屏幕,这样您就只能使用平板电脑。每次我们分离屏幕,我们的应用程序挂起。移除飞溅后我们的问题就消失了。
顺便说一句,我们从悬挂程序中获得了完全相同的堆栈跟踪:
System.Threading.WaitHandle.WaitOne (Source Unavailable)
1. System.Threading.WaitHandle.WaitOne (Source Unavailable)
2. System.Threading.WaitHandle.WaitOne (Source Unavailable)
3. System.Management.MTAHelper.WorkerThread (Source Unavailable)
4. System.Threading.ThreadHelper.ThreadStart_Context (Source Unavailable)
5. System.Threading.ExecutionContext.Run (Source Unavailable)
6. System.Threading.ThreadHelper.ThreadStart (Source Unavailable)
Offcourse我不知道你的问题是否有相同的原因/解决方案......但这是为我们做的。
答案 2 :(得分:0)
我看到了一个类似的挂起,其中一个线程正在调用Application.get_ComCtlSupportsVisualStyles。
我想知道你是否启用了视觉风格? http://ryanfarley.com/blog/archive/2004/05/05/599.aspx描述了如何使用代码或清单文件来执行此操作。 (我认为清单文件是首选解决方案。)
如果你启用了视觉样式,并假设操作系统支持主题(我认为这个功能是从XP开始的),那么Application.get_ComCtlSupportsVisualStyles不需要做太多的工作,并且可以快速返回true。
所有这一切,我仍然不明白为什么对GetModuleHandle()的调用会挂起。我在网上发现的大部分内容都表明它在LoadLibrary()期间会出现问题,而不是在.NET Win Forms绘制事件期间。我不知道你是否有另一个线程同时在LoadLibrary()中做不安全的工作......?