【发布时间】:2012-06-09 07:48:07
【问题描述】:
慢慢地我过度劳累了......
我有一个带有线程、计时器、调用(不是 BeginInvoke,所以它是同步的)和 Application.DoEvents 的大型应用程序。
在这里发帖太多了,我不知道问题出在哪里。
我的每个方法都在一个 try catch 中。每一次捕获都会被记录下来。
如果我从 Visual Studio (F5) 启动我的应用程序或通过 Ants 对其进行分析,则没有问题。该应用程序从几天开始运行。 但是,一旦我通过 Windows 资源管理器启动相同的调试版本,它就会每隔几个小时冻结一次。它毫无例外地冻结。 如果我将 Visual Studio 附加到此应用程序并破坏它,它会在 Application.Run(new Form1());
上停止我真的很困惑,不知道要修复它。
这是一个 .net 3.5 winforms 应用程序
这里好像挂了一个线程:
if (grabber.InvokeRequired)
{
Console.WriteLine("grabber.InvokeRequired");
this.Invoke((MethodInvoker) delegate { grabber.Navigate("http://www.google.de"); }); // <-- hang
}
else
{
grabber.Navigate(ig.StartUrl);
}
这个 sn-p 是计时器事件的一部分
_timeout = new System.Timers.Timer(10000);
_timeout.Elapsed += new ElapsedEventHandler(OnWatchDogBark);
编辑
DoEvents() 的示例。这是在 lock() 和调用中
grabber.DocumentCompleted -= grabber_DocumentCompleted;
grabber.Navigate("http://www.google.de");
while (grabber.ReadyState != WebBrowserReadyState.Complete)
{
timeout--;
Application.DoEvents();
Thread.Sleep(200);
if (timeout < 0)
{
timeout = 50;
grabber.Navigate("http://www.google.de");
}
}
目前我使用 System.Windows.Forms.Timer 和一些锁,但没有任何改进。
好的,我用 WinDbg 来获取一些信息
编辑:14.06.2012
!线程
PreEmptive GC Alloc Lock
ID OSID ThreadOBJ State GC Context Domain Count APT Exception
0 1 37ec 007cab18 6020 Enabled 00000000:00000000 007c8510 0 STA System.ArgumentException (02762ba8)
2 2 85b8 007d7c38 b220 Enabled 00000000:00000000 007c8510 0 MTA (Finalizer)
XXXX 3 0 06e9f548 9820 Enabled 00000000:00000000 007c8510 0 Ukn
21 5 3464 0d6dc598 200b020 Enabled 28cb5820:28cb5fe8 007c8510 0 MTA
22 6 62b0 0d6db9e0 200b220 Enabled 00000000:00000000 007c8510 0 MTA
23 7 8e58 0d6db5f8 80a220 Enabled 00000000:00000000 007c8510 0 MTA (Threadpool Completion Port)
XXXX 4 0 06f62d40 1801820 Enabled 00000000:00000000 007c8510 0 Ukn (Threadpool Worker)
XXXX f 0 132a3290 1801820 Enabled 00000000:00000000 007c8510 0 Ukn (Threadpool Worker)
XXXX 10 0 132a3678 1801820 Enabled 00000000:00000000 007c8510 0 Ukn (Threadpool Worker)
XXXX e 0 132a26d8 1801820 Enabled 00000000:00000000 007c8510 0 Ukn (Threadpool Worker)
XXXX 9 0 0d6db210 1801820 Enabled 00000000:00000000 007c8510 0 Ukn (Threadpool Worker)
!dlk
Examining SyncBlocks...
Scanning for ReaderWriterLock instances...
Scanning for holders of ReaderWriterLock locks...
Scanning for ReaderWriterLockSlim instances...
Scanning for holders of ReaderWriterLockSlim locks...
Examining CriticalSections...
Could not find symbol ntdll!RtlCriticalSectionList.
No deadlocks detected.
【问题讨论】:
-
您的手上出现了僵局。不过,这些都很难诊断。
-
可能是内存泄漏导致内存不足 memory leak in c sharp , how-to-detect-memory-leaks in-c-sharp-application?
-
是的,和 zmbq 一样。从 IDE 运行它会大大降低它的速度,因此并发锁不太可能发生。
-
使用grabber.InvokeRequired然后使用this.Invoke()是没有意义的。在允许表单关闭之前,请始终确保线程已结束、计时器已禁用并且所有 Elapsed 调用已耗尽。并且绝对不要在 10 秒的间隔内使用 Timers.Timer,Winforms 计时器也可以正常工作,并且不会给您带来同步痛苦。
-
如何使用 Application.DoEvents?这对我来说是一个危险信号。
标签: c# visual-studio-2010 visual-studio-2008 freeze