【问题标题】:cmd.exe process doesn't stop when c# program endsc#程序结束时cmd.exe进程不会停止
【发布时间】:2018-02-12 18:47:15
【问题描述】:

我有一个 c# 程序,它可以通过为 cmd.exe 创建一个进程并使用启动程序的参数启动它来启动另一个程序。这很好用。但是,当 c# 程序终止时,cmd.exe 进程并没有停止。所以如果我运行程序 5 次,仍然有 5 个 cmd.exe 进程打开。

我是否需要明确关闭该进程?该过程可能并不总是开放的,因此我不确定执行此操作的最佳方法。我使用“using”语句的目的是让 cmd.exe 进程在完成后被释放。

                using (Process cmd = new Process())
            { 
                cmd.StartInfo.FileName = "cmd.exe";
                cmd.StartInfo.CreateNoWindow = true;
                cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
                cmd.StartInfo.WorkingDirectory = System.IO.Path.GetDirectoryName(SimProperties.dbJarPath);
                cmd.StartInfo.Arguments = String.Format("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11}",
                    "/k",
                    "java",
                    "-Xms2048m",
                    "-Xmx2048m",
                    "-XX:NewRatio=3",
                    "-Xss1024m",
                    "-XX:+UseParallelGC",
                    "-XX:MaxGCPauseMillis=100",
                    "-XX:ParallelGCThreads=9",
                    "-jar",
                    SimProperties.dbJarPath,
                    SimProperties.dbScenarioPath);

                cmd.Start();
            }    

【问题讨论】:

  • 为什么一定要使用cmd
  • 另外,所有这些硬编码参数的意义何在?为什么不一次传递整个命令?

标签: c# cmd


【解决方案1】:

发生的情况是您的 cmd.exe 执行命令(java 控制台),然后返回到命令提示符。

CMD /K 运行命令,然后返回 CMD 提示符。

https://ss64.com/nt/cmd.html

改用CMD /c

您也可以在不调用控制台的情况下运行 java 控制台。而不是:

cmd.StartInfo.FileName = "cmd.exe";

试试

cmd.StartInfo.FileName = "C:\...full path to your java...\java.exe";

【讨论】:

  • 完美..谢谢!
【解决方案2】:

cmd.exe 与您的应用程序是不同的进程,因此您需要显式释放它。
您可以像这样杀死所有 cmd 进程:

Array.ForEach(Process.GetProcessesByName("cmd"), x => x.Kill());

可以在应用程序的关闭事件中执行此行。

【讨论】:

  • 杀死计算机上所有正在运行的 cmd 进程。不仅是你跑步的那个
  • 所以通过GetProcessById()找到你的具体流程。
  • 没这么说:)