【问题标题】:How to close all child processes in C#C#如何关闭所有子进程
【发布时间】:2020-12-19 11:07:38
【问题描述】:

C#代码:

ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.Verb = "runas";        
processStartInfo.FileName = fileNameToExecute;
processStartInfo.Arguments = parameters;
Process process = new Process();
processStartInfo.UseShellExecute = false;
processStartInfo.CreateNoWindow = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;
process.StartInfo = processStartInfo;
process.Start();
process.WaitForExit();
process.Close();

我正在从 C# windows 应用程序调用 java.exe。 java.exe 用于测试一些网站。 Java 使用 Selenium 通过打开默认 Web 浏览器来测试网页。它将打开 3 到 10 次浏览器并测试测试用例。我想在 C# 应用程序中添加停止按钮,当我们单击它时,它应该关闭 java.exe 以及那些打开的浏览器。怎么做?

我尝试使用这样的 exe 名称获取进程名称

Process[] processName = Process.GetProcessesByName(fileName.Substring(0, fileName.LastIndexOf('.')));

但它不起作用。

【问题讨论】:

    标签: java c# selenium selenium-webdriver process


    【解决方案1】:

    找到你的java.exe进程的进程ID并以/T参数启动TASKKILL作为外部进程来杀死整个父子进程树:

    例子:

    TASKKILL /PID 1230 /T
    

    MSDN Taskkill

    【讨论】:

      【解决方案2】:
      
      Process process = new Process();
      processStartInfo.UseShellExecute = false;
      processStartInfo.CreateNoWindow = true;
      processStartInfo.RedirectStandardOutput = true;
      processStartInfo.RedirectStandardError = true;
      
      process.StartInfo = processStartInfo;
      process.Start();
      javaExeProcessId = process.Id; //global variable
      process.WaitForExit();
      process.Close();
      
      

      在开始一个新进程之前,我已将 processId 存储在一个全局变量中。

      
      private static void KillProcessAndChildren(int pid)
      {
          // Cannot close 'system idle process'.
          if (pid == 0)
          {
              return;
          }
          ManagementObjectSearcher searcher = new ManagementObjectSearcher
                  ("Select * From Win32_Process Where ParentProcessID=" + pid);
          ManagementObjectCollection moc = searcher.Get();
          foreach (ManagementObject mo in moc)
          {
              KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
          }
          try
          {
              Process proc = Process.GetProcessById(pid);
              proc.Kill();
          }
          catch (Exception ex)
          {
              // Process already exited.
          }
      }
      
      
      

      我调用了 KillProcessAndChildren(javaExeProcessId);在需要的地方终止当前进程及其子进程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 2016-02-01
        • 1970-01-01
        相关资源
        最近更新 更多