我已经用Visual Studio 2010构建了一个C#Windows窗体应用程序。
在短时间内成功完成运行和关闭应用程序。 该进程未在任务管理器中运行。调试过程也将关闭。没问题。
但是,如果应用程序正在运行一段时间,则该程序无法关闭,而仍然在Task-Manager中运行 (我只是打开了附件,没有做其他任何事情,只需等待几个小时即可重现该问题)。 在调试模式下,我必须单击“停止调试”按钮以结束进程。
我该怎么办才能找到根本原因?
答案 0 :(得分:0)
如果您的项目包含多个表单,则应转到最后一个表单的事件,然后双击“ FormClosed”事件。在此操作将您发送到代码后,请在方括号之间输入:
Application.Exit();
答案 1 :(得分:0)
所有前台线程停止后,进程结束。
在典型的Winforms应用程序中,有一个主要的前台线程-UI线程。关闭主窗体(在Application.Run
中使用的窗体)后,此操作停止。然后检查您的Main
方法在做什么,或者只是在其中放置一个断点以查看线程是否成功
如果您正在执行多线程,则可能还会有一些前台工作线程。确保它们都已停止是您的责任。棘手的是,您正在使用的某些类可能在不知情的情况下自行旋转此类线程。首先要记住的是,您创建的实现IDisposable
的任何对象实际上都应该被处置。这可以解决问题。一个经常引起麻烦的示例是System.Threading.Timer
(或System.Timers.Timer
)-如果您不Dispose
,它将使您的应用程序无限期运行。
要调查此问题,可以使用Visual Studio调试器中的线程列表(“调试”->“ Windows”->“线程”)。运行应用程序,等待所需的时间,关闭表单,然后暂停调试器。线程列表将显示该进程中的所有托管线程。查看正在运行的线程上的位置-双击一个线程会将调试器视图切换到该线程,然后可以看到调用堆栈。这可能使您对线程来自何处以及当前正在执行什么代码(即为什么被卡住)有一些了解。您可能会在某处看到一个等待(除非它实际上正在执行CPU工作);只需查看调用堆栈(调试-> Windows->调用堆栈)并寻找可识别的内容即可。
如果您检查了所有线程,并且在调用堆栈中看不到任何可疑的内容,则可能必须在调试器中进行一些配置。您可以尝试两种主要方法-首先,在调用堆栈窗口中,右键单击并选择“显示外部代码”。如果这样做没有帮助,则可能必须禁用“我的代码”(“选项”->“调试器”),并为涉及的模块启用符号加载。这有点复杂。
答案 2 :(得分:0)
您可以使用
Environment.Exit(0);
代替。