1

我试图找出我的 WPF 应用程序在调试时没有干净地结束的原因。“干净”是指所有窗口都已关闭,我可以在“输出”窗口中看到各种消息,显示应用程序已结束但进程仍处于活动状态,并且调试器中的“停止”按钮仍处于活动状态。

我调用了该Shutdown()方法,但有些东西正在阻止应用程序结束。我很确定这与与 IO 设备的以太网连接有关,但看不到我做错了什么。(当我注释掉连接设备的调用时,应用程序可以干净地退出)

我想知道 VSE 2010 是否可以列出所有活动线程,因为这可能会提供有关主程序结束后仍然“活动”的线索。或者是否有一个外部工具可以在这里提供帮助?

4

2 回答 2

3

您应该能够使用Visual StudioThreads窗口查看哪些线程仍处于活动状态。我不完全确定这个窗口在 Express 版本中是否可用(文档没有提到这样的限制),但如果你没有它,那么你也可以使用 WinDbg 列出所有线程。WinDbg 是Windows 调试工具的一部分。您可能需要安装最新版本的 Windows SDK 才能获得它。

于 2013-01-22T12:26:08.327 回答
3

首先使用调试器。Debug + Break All, Debug + Windows + Threads 看看哪些线程还在运行。您可以双击一个并使用 Debug + Windows + Call Stack 来查看它在做什么。典型的情况是您启动但忘记告诉终止的线程。Thread.IsBackground 属性是一种让 CLR 自动为您中止线程的方法。

从技术上讲,阻止进程关闭的设备可能会出现问题。Threads 窗口通常只显示一个线程,该线程具有其他无法穿透的堆栈跟踪。如果您使用任务管理器、进程选项卡、查看 + 选择列,勾选句柄,那么您可能会看到只有一个句柄仍在使用中。然后诊断是您的机器上有一个糟糕的设备驱动程序,它不能正确支持 I/O 取消。这可能会使内核线程运行而不会退出,从而阻止进程终止。很不寻常,先找第一段给出的理由。

于 2013-01-22T12:43:25.987 回答