【问题标题】:Exiting a C# winforms application退出 C# winforms 应用程序
【发布时间】:2012-01-20 10:24:56
【问题描述】:

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

当我以调试模式退出应用程序时,表单关闭,但 VS IDE 并未“停止”。

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

【问题讨论】:

标签: c# winforms visual-studio-2010


【解决方案1】:

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

更新:好吧,我误会了。以上是正确的,但您可能在后台挂起线程时遇到问题。您需要终止线程以使其正确关闭。亚瑟的回答涵盖了这一点。如果你只是想做一个超级hacky的快速和肮脏的杀戮,你可以使用以下方法(尽管我对副作用不承担任何责任,因为它非常hacky):

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

【讨论】:

  • 我大体上同意,除了在这个特定场景中 VS 调试器会话仍在进行,表明应用仍在运行(至少,我是这样解释问题的)
  • 多项式的语法应该是 System.Diagnostics.Process.GetCurrentProcess().Kill();
【解决方案2】:

进程没有终止,因为它还有foreground threads running

如果您在应用程序中创建线程,则需要 mark them as background 线程或确保它们在您希望应用程序退出时终止。

【讨论】:

    【解决方案3】:

    你试过更残酷的Environment.Exit()函数吗?

    Application.Exit() 只是发送一条消息说关机;如果消息从未得到处理(无论出于何种原因),应用程序将无限期地保持运行。

    来自MSDN documentation of Application.Exit()

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

    【讨论】:

    • 好吧,表单退出了,当我做一个断点时,我确实打了那行,它执行得很好。所以那行确实被执行了。
    • @Troy:是的,但是调用Application.Exit() 只是将消息发布到所有消息泵的队列中;您的表单的泵似乎在处理消息并退出,但还有其他东西(可能是另一个线程?)没有注意到请求
    【解决方案4】:

    我遇到了由第三方工具导致的类似问题,该工具不允许我将线程设置为背景。多项式有正确的想法,但是语法是这样的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 2018-08-07
      • 2012-10-10
      相关资源
      最近更新 更多