退出C# WinForms应用程序

17

我有一个从Excel导入数据的应用程序。然而,当我运行winforms应用并使用System.Windows.Forms.Application.Exit();中断应用程序时,在任务管理器中仍然可以看到"MyAppName".vshost32.exe正在运行。

在调试模式下退出应用程序后,窗体关闭了,但VS IDE没有“停止”。

如何确保应用程序正确结束。


类似的问题可以参考 https://dev59.com/qm855IYBdhLWcg3wfUVM - dash
4个回答

24
您对 Application.Exit() 的调用正常工作。 MyAppName.vshost32.exe 可执行文件是用于调试目的的主机。只要在 Visual Studio 中打开了项目,无论是否存在活动调试会话它都在运行。

更新: 好的,我误解了。上面的内容是正确的,但您可能遇到了后台挂起线程的问题。您需要终止线程以使其正确关闭。Asher的答案涵盖了此项工作。如果你只是想进行一次超级hacky快速而肮脏的杀戮,可以使用以下命令(尽管我不对副作用负责,因为这是极端hacky的):

System.Diagnostics.Process.GetCurrentProcess().Kill();


1
总的来说,我同意,但在这种特定情况下,VS调试器会话仍在进行中,这表明应用程序仍在运行(至少,这是我对问题的理解)。 - Cameron
多项式的语法应该是 System.Diagnostics.Process.GetCurrentProcess().Kill(); - Nick Binnet

17

7

你是否试过更加暴力的Environment.Exit()函数?

Application.Exit()只是发送一个关闭消息;如果该消息没有被处理(无论什么原因),应用程序将无限期地保持运行状态。

根据Application.Exit()的MSDN文档:

Exit方法停止所有线程上运行的消息循环,并关闭应用程序的所有窗口。该方法不一定强制应用程序退出。Exit方法通常从消息循环中调用,并强制Run返回。


好的,表单已经存在,当我设置断点时,我确实会命中那一行,并且它可以正常执行。因此,该行代码确实被执行了。 - Troy
@Troy:没错,但调用Application.Exit()只是向所有消息泵的队列发布一条消息;你的窗体泵似乎处理了该消息并退出,但还有其他东西(也许是另一个线程?)没有听从请求。 - Cameron

4

我曾经遇到过类似的问题,是由于一个第三方工具不允许我将线程设置为 Background。 Polynomial 的想法是正确的,但是语法应该是这样的:

System.Diagnostics.Process.GetCurrentProcess().Kill();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接