У меня есть приложение 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 Какую альтернативу вы бы предложили?
WaitForExit()
для процесса, который он запустил, а затем убил, но вы утверждаете, что BW действительно завершается. Так что в коде есть некоторое противоречие с тем, что вы говорите. - person Peter Duniho   schedule 05.12.2014while (!myProcess.HasExited)
,while (someTask.IsAlive)
илиwhile (someSource.DataAvailable)
, убедитесь, что вы на неверном пути. - person L.B   schedule 06.12.2014