System.Diagnostics.Process.Kill не работает должным образом. С#

У меня есть приложение 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(); фоновый рабочий останавливается, и все в порядке, но я вижу, что мой процесс все еще работает из диспетчера задач, даже если я закрываю свое приложение, я все равно вижу в диспетчере задач, что мой процесс запущен.

У меня вопрос, как правильно убить процесс?

Надеюсь, я ясно описал свою проблему, если нет, не стесняйтесь, дайте мне знать, если вам нужна дополнительная информация.

Любая помощь будет оценена по достоинству.

//-------------- Обновление от 8 декабря 2014 г. -------//

@RogerN Я удалил Process.WaitForExit() и добавил myStreamReader.ReadToEnd() тот же процесс проблемы, который все еще активен даже после закрытия приложения.

@phillip Это консольное приложение (автономное *.exe), которое я вызываю из своей WinForm.

@Peter Duniho да, я уверен, что это тот же процесс в диспетчере задач. Удаление WaitForExit() ничего не решило, BW на самом деле выполнил нормально без каких-либо проблем.

@LB Какую альтернативу вы бы предложили?


person Farukh    schedule 05.12.2014    source источник
comment
что это за процесс? если это сервис, то вы отвечаете иначе, чем если бы это был автономный исполняемый файл.   -  person phillip    schedule 05.12.2014
comment
Вы уверены, что процесс, который вы видите в диспетчере задач, это тот, который вы запустили? Ваш код BW вызывает WaitForExit() для процесса, который он запустил, а затем убил, но вы утверждаете, что BW действительно завершается. Так что в коде есть некоторое противоречие с тем, что вы говорите.   -  person Peter Duniho    schedule 05.12.2014
comment
Вы запускаете программу от имени администратора?   -  person    schedule 05.12.2014
comment
Подсказка: если вы обнаружите, что пишете код с занятым ожиданием, например while (!myProcess.HasExited) , while (someTask.IsAlive) или while (someSource.DataAvailable), убедитесь, что вы на неверном пути.   -  person L.B    schedule 06.12.2014


Ответы (1)


Тупик может возникнуть из-за того, что вы вызываете Process.WaitForExit() перед чтением всего выходного потока. Поскольку вы перенаправили выходной поток, вы должны прочитать все данные из связанного потока, прежде чем процесс сможет нормально завершиться.

person RogerN    schedule 05.12.2014
comment
Это обычный исполняемый файл консоли, я удалил Process.WaitForExit(), но проблема осталась. Да, я уверен, что это тот же процесс в моем диспетчере задач. Пробовал запускать от имени администратора и обычного пользователя такая же проблема. Что вы хотите использовать вместо цикла while? - person Farukh; 07.12.2014
comment
Поскольку вы перенаправляете как стандартный вывод, так и стандартный поток ошибок, вам нужно убедиться, что вы прочитали до конца обоих потоков, прежде чем процесс сможет завершиться. В приведенном выше цикле while вы читаете только из стандартного вывода, а не из стандартного потока ошибок, поэтому процесс может никогда не завершиться нормально. - person RogerN; 09.12.2014
comment
Я обновил цикл while (см. код в моем первом посте), тот же процесс проблемы все еще активен после закрытия приложения. Должно быть что-то еще не так. Может быть, я неправильно устанавливаю ProcessStartInfo? - person Farukh; 09.12.2014
comment
Хорошо, я думаю, что понял, что-то с этим конкретным файлом *.exe, точно не знаю, но я пробовал использовать другую консоль *.exe, и она работает нормально. Выйти, как только я нажму «Отмена». Не уверен, что делать дальше, так как мне нужно запустить это конкретное консольное приложение. Если у кого есть подсказки или советы буду признателен. - person Farukh; 10.12.2014
comment
Возможно, myStreamReader.ReadLine() блокирует выполнение - person RogerN; 11.12.2014