1 回答
TA贡献1796条经验 获得超7个赞
所有前台线程停止后,进程结束。
在典型的 Winforms 应用程序中,有一个主前台线程 - UI 线程。这会在主窗体(在 中使用的窗体Application.Run
)关闭后停止。之后检查您的Main
方法正在做什么,或者只是在那里放置一个断点以查看线程是否成功
如果您正在执行多线程,您可能还会有一些前台工作线程。您有责任确保它们全部停止。棘手的部分是您正在使用的某些类可能会在您不知情的情况下自行启动此类线程。首先要记住的是,您创建的任何实现的对象IDisposable
实际上都应该被释放。这可能会解决这个问题。一个经常引起麻烦的例子是System.Threading.Timer
(or System.Timers.Timer
) - 如果你不这样做Dispose
,它会让你的应用程序无限期地运行。
要调查此问题,您可以使用 Visual Studio 调试器中的线程列表(调试 -> Windows -> 线程)。运行应用程序,根据需要等待,关闭窗体,然后暂停调试器。线程列表将显示进程中的所有托管线程。查看正在运行的线程的位置 - 双击一个线程会将调试器视图切换到该线程,然后您可以看到调用堆栈。这可能会让您了解该线程来自何处,以及它当前正在执行什么代码(即它为什么被卡住)。您可能会在某处看到一个等待(除非它实际上在做 CPU 工作);只需查看调用堆栈(调试 -> Windows -> 调用堆栈)并查找可识别的内容。
如果您检查了所有线程,并且在调用堆栈中看不到任何可疑的东西,则可能需要在调试器中进行一些配置。您可以尝试两种主要方法 - 首先,在调用堆栈窗口中,右键单击并选择“显示外部代码”。如果这没有帮助,您可能必须禁用“仅我的代码”(选项 -> 调试器),并为所涉及的模块启用符号加载。这有点复杂。
- 1 回答
- 0 关注
- 174 浏览
添加回答
举报