C#控制台程序结束后无法关闭的问题

10

我有一个C#应用程序正在运行,然后在某个点上应用程序抛出一个错误,然后被捕获,然后应用程序应该结束。它确实结束了,但控制台窗口仍然保持打开状态...

我甚至在Windows任务管理器中检查了一下,在“应用程序”选项卡下,我的控制台被列出来,但是当我点击“转到进程”时,没有该应用程序的进程。

这很奇怪...应用程序已经结束了,进程也已经结束了,但是控制台还在运行?如何关闭那个控制台?

编辑:我的代码:

static class Program
    {
        static void Main()
        {
            try
            {
                //bunch of static methods from other static classes are being invoked

                Setup.Driver.Close();//another static method
            }
            catch (Exception)
            {
                Setup.Driver.Close();
            }
        }
    }

第二次编辑:注意:Process.Getprocess().Kill(),Application.Exit(),Environment.Exit()对我来说都不起作用,在Windows任务管理器中,没有进程可以杀死,只有控制台保持开放!


你能发一下代码吗? - Prashant
4
你用过线程吗? - Hamlet Hakobyan
1
你是否显式地创建了线程?代码不足。而且,将 Setup.Driver.Close(); 移动到 finally 块中并仅使用一次是个好主意。 - Hamlet Hakobyan
@HamletHakobyan:明确地说,我不这么认为...虽然我正在使用Selenium,它在浏览器窗口上运行,所以可能涉及一些外部线程... - ojek
使用 Environment.Exit(0) 应该已经关闭了程序,除非您的应用程序中使用了线程,如 @HamletHakobyan 所述,或者在代码中的某个地方使用了 Console.ReadLine()。 - Prashant
显示剩余5条评论
6个回答

6
Environment.Exit(0);

或者
this.Close();

如果你有正在运行的线程,你可以在调用 Exit 前尝试这种蛮力方法:
using System.Diagnostics;

ProcessThreadCollection currentThreads = Process.GetCurrentProcess().Threads;

foreach (var thread in currentThreads)
{
   thread.Interupt(); // If thread is waiting, stop waiting

   // or

   thread.Abort(); // Terminate thread immediately 

  // or

   thread.IsBackGround = true;
}

无法工作,Process.GetProcess().Kill()也无法工作。我认为这是因为进程在没有任何问题的情况下结束,只有控制台窗口保持打开状态。 - ojek
在你的 try 代码块中,你是如何关闭应用程序的?你使用了 Console.ReadLine(); 然后调用了 Application.Exit(); 吗? - Pyromancer
1
我不得不使用 foreach (ProcessThread thread in currentThreads) 然后调用 thread.Dispose();。看起来 thread.Finalize(); 也可以工作。[ https://msdn.microsoft.com/en-us/library/system.diagnostics.processthread(v=vs.110).aspx ] - christo8989
这段代码对我来说无法运行,但是杀掉我启动的进程却解决了问题。 - Lightsout

6

1
要使用Application.Exit(),您需要在控制台应用程序中包含System.Windows.Form的引用,这在控制台应用程序中默认情况下是不必要的。 - Prashant

1

早上好,

如果您从Visual Studio附带调试器启动控制台应用程序,它是否无法关闭?或者如果您在文件系统中启动它/没有附加调试器,它也无法关闭吗?

当调试器附加时,您将始终看到“按ENTER键退出...”(或类似消息)。

谈到任务管理器-您是否在其中看到*.vshost进程?如果是,则这是Visual Studio所需的,而不是您的“真实”控制台应用程序;当从Visual Studio内部启动可执行文件时,您将始终看到一个*.vshost进程。

希望这可以帮助到您。


我试图关闭 vshost,因为它是唯一留在进程树中的东西。但是在关闭它之后,控制台仍然保持开启状态,只是没有进程剩余。至于第一个问题 - 程序在 VS 中运行良好,只有在我在操作系统下运行它时才会保持控制台开启。 - ojek

1
我也曾遇到这个问题。在完成浏览器操作后,我只是使用了Driver.Close();。然而,这样做仍然会让chromedriver在后台运行。所以我改用了Driver.Quit();。然后我确保从Main方法中return;
希望这可以帮助你!

非常感谢。我被卡在这里已经4个小时了,浏览器一直关闭,我从来没有想过要检查驱动程序是否也关闭了。 - Bob Cummings

1
你的程序很可能与另一个进程链接在一起,导致其无法关闭。
在我的情况下,该进程是chromedriver。
检查你的进程和代码,看看你打开了什么,以及后台还有哪些进程在运行。

关于您之前被删除的帖子,https://stackoverflow.com/questions/51996344/checking-array-size-using-event-driven-programming-in-javascript-node-js 。您遇到了 XY 问题。您所询问的事情没有意义。我需要它能够与我的其他代码并行工作。 - 考虑重新提出问题,并详细解释您的真实问题并提供 https://stackoverflow.com/help/mcve 。然后就可以得到答案了。 - Estus Flask
进程被“杀死”,但控制台仍然保持打开状态。 - BrainSlugs83

-2
Environment.Exit();

这个能行吗?


无法工作,Process.GetProcess().Kill()也无法工作。我认为这是因为进程在没有任何问题的情况下结束,只有控制台窗口保持打开状态。 - ojek

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