我已经“继承”了一个我必须调试的遗留 C#/C++ 程序。当前的问题是我关闭程序后.exe 不会停止,即它仍然显示在任务管理器中。
这是一个问题,因为它不会让我重新启动程序,因为只能运行一个实例。通常杀死进程是行不通的;我被迫重新启动。
我的印象是当主程序停止时,所有子线程也应该停止,但我可能错了。
问:什么会导致 .exe 无法停止?
我已经“继承”了一个我必须调试的遗留 C#/C++ 程序。当前的问题是我关闭程序后.exe 不会停止,即它仍然显示在任务管理器中。
这是一个问题,因为它不会让我重新启动程序,因为只能运行一个实例。通常杀死进程是行不通的;我被迫重新启动。
我的印象是当主程序停止时,所有子线程也应该停止,但我可能错了。
问:什么会导致 .exe 无法停止?
子线程不会自动停止,除非它们被专门设置为后台线程(即,使用thread.IsBackground = true
)。
编辑:当表单关闭时主线程也可能没有终止(即,还有其他代码设置为在关闭后运行但未完成)。
我发现使用调试器附加到正在运行的进程并按下暂停按钮很有用。之后,我将检查“线程”窗口并查看堆栈跟踪为每个正在执行的线程所做的事情。默认情况下隐藏线程窗口。以下是有关如何显示和使用它的更多信息:
我的猜测是所有线程都没有停止。通常你可以结束程序的任务,但它会停止。也许一个线程挂在了更难释放的系统资源上。
如果您可以获得调试版本,请运行程序并在程序“退出”后,点击调试窗口中的暂停按钮。此时,您可以查看线程并找出挂起的线程。为了提供帮助,您应该在创建线程时为其命名(这是 .Start 函数中的一个额外参数)
您可能想查看process explorer。它使关闭程序变得更容易,它可以查看程序的线程,并可能为您指明程序运行的正确方向。
启动形式是关闭以退出应用程序的形式吗?如果不是,您需要将 Application.Exit() 或 Environment.Exit() 放在最后关闭的表单的 form.closed 事件中。
在最基本的层面上,某处存在无限循环。