Questo codice viene eseguito come previsto su un numero elevato di macchine. Tuttavia su una macchina particolare, la chiamata a WaitForExit()
sembra essere ignorata e in effetti segna il processo come uscito.Process.WaitForExit incoerente su diverse macchine
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();
}
noti che diversamente una similar question su SO, il procedimento essendo chiamato è notepad.exe
(per motivi di test), quindi è improbabile la colpa è esso - cioè esso non sta generando un secondo sottoprocesso e chiusura. Anche così, non spiegherebbe perché funziona su tutte le altre macchine.
Sulla macchina con problemi, la seconda chiamata a Console.WriteLine(proc.HasExited))
restituisce true
anche se il blocco note è ancora chiaramente aperto, sia sullo schermo sia nel task manager.
La macchina esegue Windows 7 e .NET 4.0.
La mia domanda è; quali condizioni su quella particolare macchina potrebbe causare questo? Cosa dovrei controllare?
Edit - Le cose che ho provato finora/Aggiornamenti/info Forse rilevanti:
- .NET reinstallati.
- Chiude tutti i processi che non conosco nel task manager.
- Windows non è stato ancora attivato su questa macchina.
- Seguendo i commenti nei commenti, ho provato a ottenere l'ID del processo "esistente" utilizzando
GetProcessesByName
ma che restituisce semplicemente un array vuoto sul computer con problemi. Pertanto, è difficile dire che il problema è anche conWaitForExit
, in quanto il processo non viene restituito chiamandoGetProcessesByName
anche prima di chiamareWaitForExit
. - Sul computer del problema, il ParentID del processo del blocco note risultante è l'ID del processo del blocco note che il codice avvia manualmente, o in altre parole, il blocco note genera un processo secondario e termina automaticamente.
È possibile che sia stato aperto un altro blocco note in precedenza? Quindi ne crei uno, ne uccidi uno, ma vedi ancora il vecchio Blocco note? 'proc.WaitForExit()' può tornare immediatamente, se non è stato possibile creare il processo o è stato terminato immediatamente a causa di alcuni motivi, ad esempio la mancanza di privilegi del codice originale per creare nuovi processi. – oleksii
@oleskii, no mi sono assicurato di questo. Blocco note viene utilizzato solo qui come un processo "che tutti sanno", questo problema si verifica indipendentemente dal file utilizzato per il processo. – Rotem
@oleskii "proc.WaitForExit() può restituire immediatamente, se non è stato possibile creare il processo o è stato interrotto immediatamente a causa di alcuni motivi" - il processo non sarebbe effettivamente terminato in questo caso? – Rotem