Tengo el siguiente código, pero ¿por qué ProcessExitednunca se llama al método? Es lo mismo si no uso el shell de Windows ( startInfo.UseShellExecute = false).
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.FileName = path;
startInfo.Arguments = rawDataFileName;
startInfo.WorkingDirectory = Util.GetParentDirectory(path, 1);
try
{
Process correctionProcess = Process.Start(startInfo);
correctionProcess.Exited += new EventHandler(ProcessExited);
correctionProcess.WaitForExit();
status = true;
}
.....
internal void ProcessExited(object sender, System.EventArgs e)
{
//print out here
}

Close()el proceso! Me he encontrado con un problema intermitente con el controlador de salida debido a un esfuerzo equivocado en la gestión de recursos. El código en cuestión se llamaProcess.Close()despuésProcess.Start(startInfo), en lugar de permitir que el GC lo recopile a su debido tiempo. Error fácil si su experiencia es lenguajes que no son de GC (por ejemplo, C / C ++).EnableRaisingEventsyEventHandlersdebe realizarse exactamente después delProcess.Start(). De lo contrario, no funcionará.EnableRaisingEvents=trueantes de llamarProcess.Start()y funciona bien.Desde MSDN :
¿Ha establecido esa propiedad en verdadera?
fuente
Debe establecer
Process.EnableRaisingEventsatrue.fuente
Establecer correcciónProcess.EnableRaisingEvents = true
fuente
Me he encontrado con ejemplos que se colocan
new Process()en unausingcláusula. No hagas eso si quieres usar laExitedfunción. Lausingcláusula destruye la instancia junto con los controladores de eventosExited.Esta...
Debería ser esto ...
fuente