gpt4 book ai didi

c# - 应用程序在 Visual Studio 之外卡住。从 Visual Studio 启动它时它工作

转载 作者:可可西里 更新时间:2023-11-01 08:44:26 25 4
gpt4 key购买 nike

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

我有一个带有线程、计时器、调用(不是 BeginInvoke,所以它是同步的)和 Application.DoEvents 的大型应用程序。

这里发的太多了,不知道问题出在哪里。

我的每个方法都在 try catch 中。记录每次捕获。

如果我从 Visual Studio (F5) 启动我的应用程序或通过 Ants 对其进行分析,则没有问题。该应用程序运行了几天。但是,只要我通过 Windows 资源管理器启动相同的调试版本,它就会每隔几个小时卡住一次。它毫无异常(exception)地卡住了。如果我将 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);
}

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

_timeout = new System.Timers.Timer(10000);
_timeout.Elapsed += new ElapsedEventHandler(OnWatchDogBark);

编辑

DoEvents() 的示例。这是在 lock() 和 invoke 中

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.

最佳答案

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

Toolbar -> Debug -> Windows -> Threads

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

应该有多个线程,如果您双击一个线程,您会看到它正在停止您的应用程序的那一行。

如果您在代码中加入这一行:

Control.CheckForIllegalCrossThreadCalls = false;

再次将其设置为 true。死锁的一个可能原因是后台线程访问控制。

而不是从后台线程中编写。

button1.Text = "hello"

写这个。

this.Invoke(() => button1.Text = "hello");

关于c# - 应用程序在 Visual Studio 之外卡住。从 Visual Studio 启动它时它工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10894839/

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