System.Diagnostics.Process.Kill 无法正常工作.C#.

本文关键字:工作 常工作 Process Diagnostics Kill System | 更新日期: 2023-09-27 18:33:27

我有WinForm (.NET 4.5 C#)应用程序,我有BackgroundWorker,我使用下面的代码从中开始新的Process

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker bw = sender as BackgroundWorker;
        string fileName_ = e.Argument.ToString();
        Process myProcess = new Process();
        int exitCode = 0;
        try
        {
            if (!File.Exists(fileName_))
            {
                throw new FileNotFoundException("Failed to locate " + fileName_);
            }

            #region Start Info:
            ProcessStartInfo startInfo = new ProcessStartInfo(fileName_);
            startInfo.UseShellExecute = false;
            startInfo.CreateNoWindow = true;
            startInfo.RedirectStandardOutput = true;
            startInfo.RedirectStandardError = true;
            myProcess.StartInfo = startInfo; 
            #endregion
            myProcess.Start();
            StreamReader myStreamReader = myProcess.StandardOutput;
            while (!myProcess.HasExited)
            {
                myProcess.Refresh();
                string output = myStreamReader.ReadLine();
                bw.ReportProgress(0, output);
                if (bw.CancellationPending)
                {
                    myStreamReader.ReadToEnd();
                    myStreamReader.Close();
                    myProcess.StandardError.ReadToEnd();
                    myProcess.StandardError.Close();
                    myProcess.Kill();
                    break;
                }
            }

            //myProcess.WaitForExit();

            bw.ReportProgress(0, string.Format("Process {0}  exit code: {1}", fileName_, myProcess.ExitCode));
            exitCode = myProcess.ExitCode;
            if (exitCode != 0 && !bw.CancellationPending)
            {
                string error = myProcess.StandardError.ReadToEnd();

                myProcess.Close();
                myProcess = null;
                bw.ReportProgress(0, "Process Failed with message:" + Environment.NewLine + error);
            }
            myProcess.Close();
        }
        catch (Exception ex)
        {                
            Console.WriteLine(ex);
        }
        finally
        {
            myProcess.Dispose();
            myProcess = null;
        }
        e.Result = exitCode;
    }

这部分工作正常,但是一旦我尝试使用myProcess.Kill();后台工作者停止并且一切正常,但我可以看到我的进程仍在从任务管理器运行,即使我关闭了我的应用程序,我仍然可以在任务管理器中看到我的进程正在运行。

我的问题是,如何正确终止该过程?

我希望我清楚地描述了我的问题,如果你需要更多信息,请随时告诉我。

任何帮助将不胜感激。

--------------更新 2014年12月8日 ---------------------//

@RogerN 我删除了Process.WaitForExit((并添加了myStreamReader.ReadToEnd((相同的问题进程,即使在应用程序关闭后仍然有效。

@phillip 这是我从 WinForm 调用的控制台应用程序(独立 *.exe(。

@Peter 杜尼霍是的,我确信这是任务管理器中的相同过程。删除 WaitForExit(( 并没有解决任何问题,BW 实际上完成得很好,没有任何问题。

@L.B 你会建议什么替代方案?

System.Diagnostics.Process.Kill 无法正常工作.C#.

可能会

发生死锁,因为您在读取整个输出流之前调用了Process.WaitForExit((。 由于已重定向输出流,因此必须先从关联的流中读取所有数据,然后进程才能正常退出。