.NET在Application.DoEvents上挂起

3
我们的一个遗留产品是一个Winforms应用程序,它不使用后台线程,而是在主UI线程上执行所有操作。它在这个主线程上运行一个常量循环,每20毫秒调用一次Application.DoEvents()。偶尔应用程序会在DoEvents调用处挂起。我的问题是如何找出代码挂起在哪个排队事件调用中?
附注:有没有人知道我可以使用什么工具来获取进程中每个线程的堆栈跟踪?
此外,这只发生在生产客户端,并且我们现在必须解决问题。也无法在客户端安装VS。

7
那段代码需要认真地重构。 - Tejs
调试时它会挂起吗? - user1228
1
工具被称为Visual Studio。您可以暂停进程,然后转到线程窗口。 - Andrey
我赞同@Tejs的观点,分析问题的时间最好花在重构表单上。基本上,您需要将循环移动到后台工作线程,并将任何来自后台线程的调用更改为UI线程,以便使用BeginInvoke模式。 - Dirk Vollmar
看起来我们要重构代码了...当我发布的时候,我并没有考虑这个选择,因为我的开发人员说这将是一项重大工作,但仔细看了之后,至少对于那个表单来说,并没有那么糟糕。 - John K
显示剩余2条评论
2个回答

2
你可以在Visual Studio中完成此操作,只需附加到进程,中断执行并打开线程窗口。
菜单:调试->窗口->线程

不幸的是,那不会起作用。问题出现在客户端,我们无法在本地重现该问题或在他们的计算机上安装VS。我将编辑原始问题。 - John K

0

我找到了我需要的工具。WinDbg

它可以获取当前正在运行的Windows进程的堆栈跟踪。但是,它需要该应用程序的PDB文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接