Tengo el siguiente código, pero ¿por qué ProcessExited
nunca 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 ++).EnableRaisingEvents
yEventHandlers
debe realizarse exactamente después delProcess.Start()
. De lo contrario, no funcionará.EnableRaisingEvents=true
antes de llamarProcess.Start()
y funciona bien.Desde MSDN :
¿Ha establecido esa propiedad en verdadera?
fuente
Debe establecer
Process.EnableRaisingEvents
atrue
.fuente
Establecer correcciónProcess.EnableRaisingEvents = true
fuente
Me he encontrado con ejemplos que se colocan
new Process()
en unausing
cláusula. No hagas eso si quieres usar laExited
función. Lausing
cláusula destruye la instancia junto con los controladores de eventosExited
.Esta...
Debería ser esto ...
fuente