应用程序在Visual Studio外冻结.从Visual Studio启动时它可以工作

mas*_*_99 11 c# freeze visual-studio-2010 visual-studio-2008

我慢慢地过度工作......

我有一个庞大的应用程序,包括线程,计时器,调用(不是BeginInvoke,因此它是同步的)和Application.DoEvents.

在这里发帖太多了,我不知道问题究竟在哪里.

我的每一种方法都在尝试捕获.记录每个渔获量.

如果我从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);
}
Run Code Online (Sandbox Code Playgroud)

此片段是计时器事件的一部分

_timeout = new System.Timers.Timer(10000);
_timeout.Elapsed += new ElapsedEventHandler(OnWatchDogBark);
Run Code Online (Sandbox Code Playgroud)

编辑

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

目前我使用System.Windows.Forms.Timer和一些锁,但没有任何改进.

好吧,我使用WinDbg来获取一些信息

编辑:2012年6月14日

!线程

                                      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)
Run Code Online (Sandbox Code Playgroud)

!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.
Run Code Online (Sandbox Code Playgroud)

Jür*_*ock 8

可能是后台线程中可能的死锁.尝试查看可能阻止您的应用的其他线程.

Toolbar -> Debug -> Windows -> Threads
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/w15yf86f.aspx

应该有多个线程,如果你双击一个,你会看到它停止你的应用程序的行.

如果你的代码中有这一行:

Control.CheckForIllegalCrossThreadCalls = false;
Run Code Online (Sandbox Code Playgroud)

再次将其设置为true.死锁的可能原因是后台线程访问控件.

而不是从背景线程写这个.

button1.Text = "hello"
Run Code Online (Sandbox Code Playgroud)

写这个.

this.Invoke(() => button1.Text = "hello");
Run Code Online (Sandbox Code Playgroud)