C# 为什么.exe拒绝停止?

C# 为什么.exe拒绝停止?,c#,multithreading,process,terminate,C#,Multithreading,Process,Terminate,我“继承”了一个必须调试的遗留C#/C++程序。当前的问题是.exe在我关闭程序后不会停止,即它仍然显示在任务管理器中 这是一个问题,因为它不允许我重新启动程序,因为只有一个实例可以运行。通常,扼杀这个过程是行不通的;我被迫重新启动 我的印象是,当主程序停止时,所有子线程也应该停止,但我可能错了 问:什么会导致.exe不停止?子线程不会自动停止,除非它们被专门设置为后台线程(即,使用thread.IsBackground=true) 编辑:也有可能在表单关闭时主线程没有终止(即,关闭后有其他设置

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

这是一个问题,因为它不允许我重新启动程序,因为只有一个实例可以运行。通常,扼杀这个过程是行不通的;我被迫重新启动

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


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

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


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

我猜所有线程都没有停止。通常,您可以结束程序的任务,但它会停止。可能有一个线程挂起了一个更难释放的系统资源


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

在最简单的级别上,某个地方有一个无限循环。

您可能需要研究一下。它使关闭程序变得更容易,并且可以查看程序的线程,并可能为您指出正确的程序运行方向。

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


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

不一定-可能是死锁或活锁。