5

我已经“继承”了一个我必须调试的遗留 C#/C++ 程序。当前的问题是我关闭程序后.exe 不会停止,即它仍然显示在任务管理器中。

这是一个问题,因为它不会让我重新启动程序,因为只能运行一个实例。通常杀死进程是行不通的;我被迫重新启动。

我的印象是当主程序停止时,所有子线程也应该停止,但我可能错了。

问:什么会导致 .exe 无法停止?

4

6 回答 6

12

子线程不会自动停止,除非它们被专门设置为后台线程(即,使用thread.IsBackground = true)。

编辑:当表单关闭时主线程也可能没有终止(即,还有其他代码设置为在关闭后运行但未完成)。

于 2009-01-12T22:20:22.237 回答
6

我发现使用调试器附加到正在运行的进程并按下暂停按钮很有用。之后,我将检查“线程”窗口并查看堆栈跟踪为每个正在执行的线程所做的事情。默认情况下隐藏线程窗口。以下是有关如何显示和使用它的更多信息:

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

于 2009-01-13T00:18:20.173 回答
2

我的猜测是所有线程都没有停止。通常你可以结束程序的任务,但它会停止。也许一个线程挂在了更难释放的系统资源上。

如果您可以获得调试版本,请运行程序并在程序“退出”后,点击调试窗口中的暂停按钮。此时,您可以查看线程并找出挂起的线程。为了提供帮助,您应该在创建线程时为其命名(这是 .Start 函数中的一个额外参数)

于 2009-01-12T22:21:26.947 回答
2

您可能想查看process explorer。它使关闭程序变得更容易,它可以查看程序的线程,并可能为您指明程序运行的正确方向。

于 2009-01-12T23:10:04.290 回答
0

启动形式是关闭以退出应用程序的形式吗?如果不是,您需要将 Application.Exit() 或 Environment.Exit() 放在最后关闭的表单的 form.closed 事件中。

于 2009-01-13T00:48:20.190 回答
0

在最基本的层面上,某处存在无限循环。

于 2009-01-12T22:46:35.960 回答