내가 BackgroundWorker
인 WinForm (.NET 4.5 C#)
응용 프로그램을 가지고 있는데이 코드에서 다음 코드를 사용하여 새 을 시작합니다.System.Diagnostics.Process.Kill이 제대로 작동하지 않습니다. C#
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 Duniho 예 저는 그것이 작업 관리자에서 동일한 프로세스라고 확신합니다. WaitForExit()을 제거해도 아무 것도 해결하지 못했지만 BW는 실제로 문제없이 정상적으로 완료되었습니다.
@ L.B 어떤 대안을 제안합니까?
어떤 유형의 프로세스입니까? 그것은 서비스가 있다면 당신은 독립 실행 형 exe 인 경우보다 다른 대답. – phillip
작업 관리자에 표시되는 프로세스가 시작한 프로세스입니까? BW 코드는 시작한 프로세스에서 WaitForExit()을 호출하지만 실제로 BW가 실제로 완료되었다고 주장합니다. 그래서 코드에 약간의 모순이 있습니다. –
관리자 권한으로 프로그램을 실행하고 있습니까? –