He estado observando que Process.HasExited
a veces devuelve true
aunque el proceso todavía se esté ejecutando.Process.HasExited devuelve verdadero aunque el proceso se está ejecutando?
Mi código abajo inicia un proceso con el nombre "testprogram.exe" y luego espera a que salga. El problema es que a veces me arrojan la excepción; parece que aunque HasExited
devuelve true
, el proceso en sí sigue vivo en el sistema, ¿cómo puede ser esto?
Mi programa escribe en un archivo de registro justo antes de que termine y, por lo tanto, tengo que estar absolutamente seguro de que este archivo de registro existe (es decir, el proceso ha finalizado/terminado) antes de leerlo. Verificar continuamente su existencia no es una opción.
// Create new process object
process = new Process();
// Setup event handlers
process.EnableRaisingEvents = true;
process.OutputDataReceived += OutputDataReceivedEvent;
process.ErrorDataReceived += ErrorDataReceivedEvent;
process.Exited += ProgramExitedEvent;
// Setup start info
ProcessStartInfo psi = new ProcessStartInfo
{
FileName = ExePath,
// Must be false to redirect IO
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
Arguments = arguments
};
process.StartInfo = psi;
// Start the program
process.Start();
while (!process.HasExited)
Thread.Sleep(500);
Process[] p = Process.GetProcessesByName("testprogram");
if (p.Length != 0)
throw new Exception("Oh oh");
ACTUALIZACIÓN: Sólo traté de espera con process.WaitForExit()
en lugar del bucle de sondeo y el resultado es exactamente el mismo.
Adición: El código anterior era solo para demostrar un problema "más claro" por igual. Para hacerlo claro; mi problema NO es que todavía pueda obtener el proceso por Process.GetProcessesByName("testprogram");
después de establecer HasExited
en verdadero.
El problema real es que el programa que estoy ejecutando externamente escribe un archivo -justo antes- termina (con gracia). Yo uso HasExited
para verificar cuando el proceso ha finalizado y sé que puedo leer el archivo (¡porque el proceso salió!), Pero parece que HasExited
devuelve true
incluso algunas veces cuando el programa aún NO ha escrito el archivo en el disco. Aquí está el código ejemplo que ilustra el problema exacto:
// Start the program
process.Start();
while (!process.HasExited)
Thread.Sleep(500);
// Could also be process.WaitForExit(), makes no difference to the result
// Now the process has quit, I can read the file it has exported
if (!File.Exists(xmlFile))
{
// But this exception is thrown occasionally, why?
throw new Exception("xml file not found");
}
¿Cómo se sale el testprogram.exe? ¿Llamas a Kill() sobre él o lo terminas prematuramente? ¿Saldrá normalmente después de terminar todas sus escrituras? – Tanzelax
No lo sé. Es un programa externo que estoy ejecutando y no tengo el código fuente para él.Todo lo que sé es que está retorciendo un archivo (exportando sus resultados) justo antes de que se cierre porque ese es el comportamiento que he observado a partir de él. El valor de retorno es 0, así que supongo que sale normalmente. Nada ha demostrado lo contrario. – johnrl
@ johnrl ¿Alguna vez resolvió ese problema? ¿Puede compartir su código? – GowthamanSS