Este código se ejecuta como se esperaba en un gran número de máquinas. Sin embargo, en una máquina en particular, la llamada al WaitForExit()
parece ignorarse, y de hecho marca el proceso como salido.Process.WaitForExit inconsistentes en diferentes máquinas
static void Main(string[] args)
{
Process proc = Process.Start("notepad.exe");
Console.WriteLine(proc.HasExited); //Always False
proc.WaitForExit(); //Blocks on all but one machines
Console.WriteLine(proc.HasExited); //**See comment below
Console.ReadLine();
}
Tenga en cuenta que a diferencia de un similar question en SO, el proceso que se llama es notepad.exe
(por razones de prueba), por lo que es poco probable que la falla se encuentra con ella - es decir, no está generando un segundo sub-proceso y cierre. Aun así, no explicaría por qué funciona en todas las otras máquinas.
En la máquina del problema, la segunda llamada a Console.WriteLine(proc.HasExited))
vuelve true
a pesar de que el bloc de notas sigue siendo claramente abierta, tanto en la pantalla y en el administrador de tareas.
La máquina funciona con Windows 7 y .NET 4.0.
Mi pregunta es; ¿Qué condiciones en esa máquina en particular podrían estar causando esto? ¿Qué debería estar revisando?
Editar - Cosas que he probado hasta ahora/Actualizaciones/Información Posiblemente relevantes:
- .NET reinstalado.
- Cerré los procesos que no conozco en el administrador de tareas.
- Aún no se ha activado Windows en esta máquina.
- Siguiendo los consejos en los comentarios, he intentado conseguir el proceso 'existente' Id utilizando
GetProcessesByName
sino que simplemente devuelve una matriz vacía en la máquina problema. Por lo tanto, es difícil decir que el problema es incluso conWaitForExit
, ya que el proceso no es devuelto llamandoGetProcessesByName
incluso antes de llamarWaitForExit
. - En la máquina del problema, ParentID del proceso de libreta resultante es el ID del proceso bloc de notas el código inicia manualmente, o en otras palabras, el bloc de notas está generando un proceso hijo y que termina en sí.
¿Es posible que haya otro Bloc de notas abierto antes? Entonces creas uno, matas uno, pero aún ves el viejo Bloc de notas? 'proc.WaitForExit()' puede regresar inmediatamente, si el proceso no pudo ser creado o fue terminado inmediatamente debido a algunas razones, por ejemplo, la falta de privilegios del código original para crear nuevos procesos. – oleksii
@oleskii, no, me he asegurado de esto. El Bloc de notas solo se utiliza aquí como un proceso "que todo el mundo sabe", este problema se produce sin importar qué archivo se utiliza para el proceso. – Rotem
@oleskii "proc.WaitForExit() puede regresar inmediatamente, si el proceso no se pudo crear o se finalizó de inmediato debido a algunas razones" - ¿no sería el proceso realmente finalizado en este caso? – Rotem