2

我在运行调试器时 UI 阻塞的 .NET Forms 应用程序有一个难以诊断的问题。

该块是随机的,并且在被阻止时,如果我单击调试器中的暂停按钮,它实际上并没有完成暂停,直到块释放。

我已经通过运行它在调试器之外尝试了该程序,它不会阻塞并且运行良好。

我尝试使用探查器(蚂蚁)来查找块,但在这种状态下它也不会阻止,探查器报告也没有显示任何值得注意的内容。

应用程序运行后台线程来处理套接字连接超时(使用 Threading.Timer 这些不与 UI 通信)。

网络操作正在使用BeginXXX调用。

我很难找到这个问题,因为它不会发生在用户身上,但是当这些块似乎发生时,很难尝试调试程序的其他方面。

UI 的主要焦点是一个用户控件,显示一个机器网格,它们的连接状态POSTerminal从 UI 线程的 State 对象 () 中检索,

有什么我可以看的可能找到调试器/UI阻塞之间的连接吗?

4

3 回答 3

1

这是困难的一个。我认为本系列中的视频可以为您提供一些想法来诊断正在发生的事情:

http://channel9.msdn.com/Series/-NET-Debugging-Stater-Kit-for-the-Production-Environment/Diagnosing-Application-Issues-01

于 2012-05-15T03:18:38.863 回答
1

我最终找到了这个。发生的事情是多个线程引发的事件正在返回主窗体。

在表单中它正在检查InvokeRequired然后BeginInvoke这个事件回到主窗体线程。问题是事件引发中存在一个错误,该错误引发了数千个事件,并且每个事件都被调用,这在表单的检查中具有锁定。因此导致程序(和调试器)冻结。

我没想到调试器会冻结,但是直到所有锁/调用都被处理之后,调试器中的暂停/停止才能被按下。

于 2012-05-22T00:31:56.980 回答
0

您是否尝试过检查 VS Debug->Windows->Threads 窗口?在那里,您应该能够看到您的线程的状态以及能够“切换到线程”以暂停该特定线程。

于 2012-05-15T08:58:01.237 回答