为了账号安全,请及时绑定邮箱和手机立即绑定

关闭后,我的 Windows 窗体应用程序仍在作为任务运行

关闭后,我的 Windows 窗体应用程序仍在作为任务运行

C#
绝地无双 2022-11-13 15:55:11
我已经使用 Visual Studio 2010 构建了一个 C# Windows 窗体应用程序。运行和关闭应用程序在短时间内成功完成。该进程未在任务管理器中运行。以及调试过程关闭。没有问题发生。但是,如果应用程序运行了一段时间,程序没有关闭并且仍然在任务管理器中运行(我只是打开应用程序而不做任何其他事情,只需等待几个小时来重现问题)。在调试模式下,我必须单击 STOP DEBUGGING 按钮才能结束进程。我该怎么做才能找到根本原因?
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

所有前台线程停止后,进程结束。

在典型的 Winforms 应用程序中,有一个主前台线程 - UI 线程。这会在主窗体(在 中使用的窗体Application.Run)关闭后停止。之后检查您的Main方法正在做什么,或者只是在那里放置一个断点以查看线程是否成功

如果您正在执行多线程,您可能还会有一些前台工作线程。您有责任确保它们全部停止。棘手的部分是您正在使用的某些类可能会在您不知情的情况下自行启动此类线程。首先要记住的是,您创建的任何实现的对象IDisposable实际上都应该被释放。这可能会解决这个问题。一个经常引起麻烦的例子是System.Threading.Timer(or System.Timers.Timer) - 如果你不这样做Dispose,它会让你的应用程序无限期地运行。

要调查此问题,您可以使用 Visual Studio 调试器中的线程列表(调试 -> Windows -> 线程)。运行应用程序,根据需要等待,关闭窗体,然后暂停调试器。线程列表将显示进程中的所有托管线程。查看正在运行的线程的位置 - 双击一个线程会将调试器视图切换到该线程,然后您可以看到调用堆栈。这可能会让您了解该线程来自何处,以及它当前正在执行什么代码(即它为什么被卡住)。您可能会在某处看到一个等待(除非它实际上在做 CPU 工作);只需查看调用堆栈(调试 -> Windows -> 调用堆栈)并查找可识别的内容。

如果您检查了所有线程,并且在调用堆栈中看不到任何可疑的东西,则可能需要在调试器中进行一些配置。您可以尝试两种主要方法 - 首先,在调用堆栈窗口中,右键单击并选择“显示外部代码”。如果这没有帮助,您可能必须禁用“仅我的代码”(选项 -> 调试器),并为所涉及的模块启用符号加载。这有点复杂。


查看完整回答
反对 回复 2022-11-13
  • 1 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信