J'ai le code suivant, mais pourquoi la ProcessExited
méthode n'est-elle jamais appelée? C'est la même chose si je n'utilise pas le shell 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()
le processus! J'ai rencontré un problème intermittent avec le gestionnaire de sortie en raison d'un effort malavisé de gestion des ressources. Le code en question est appeléProcess.Close()
aprèsProcess.Start(startInfo)
, plutôt que de permettre au GC de le récupérer en temps voulu. Erreur facile si votre arrière-plan est des langages non GC (par exemple C / C ++).EnableRaisingEvents
etEventHandlers
doit être effectuée exactement après leProcess.Start()
. Cela ne fonctionnera pas autrement.EnableRaisingEvents=true
avant d'appelerProcess.Start()
et cela fonctionne bien.Depuis MSDN :
Avez-vous défini cette propriété sur true?
la source
Vous devez définir
Process.EnableRaisingEvents
surtrue
.la source
Définissez correctionProcess.EnableRaisingEvents = true
la source
J'ai rencontré des exemples qui figurent
new Process()
dans unusing
article. Ne faites pas cela si vous souhaitez utiliser laExited
fonction. leusing
clause détruit l'instance avec tous les descripteurs d'événements surExited
.Ce...
Ça devrait être ça ...
la source