Ich habe folgenden Code, aber warum wird die ProcessExited
Methode nie aufgerufen? Es ist das gleiche, wenn ich keine Windows-Shell ( startInfo.UseShellExecute = false
) verwende.
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()
den Prozess nicht! Ich habe zeitweise Probleme mit dem Exit-Handler festgestellt, weil die Ressourcenverwaltung fehlgeleitet wurde. Der Code in Frage gestelltProcess.Close()
nachProcess.Start(startInfo)
, statt zuzulassen , dass die GC es zu gegebener Zeit zu sammeln. Leichter Fehler, wenn Ihr Hintergrund keine GC-Sprachen sind (z. B. C / C ++).EnableRaisingEvents
undEventHandlers
genau nach dem erfolgen mussProcess.Start()
. Sonst funktioniert es nicht.EnableRaisingEvents=true
vor dem Anruf einstellenProcess.Start()
und es funktioniert gut.Von MSDN :
Haben Sie diese Eigenschaft auf true gesetzt?
quelle
Sie müssen festlegen
Process.EnableRaisingEvents
zutrue
.quelle
Setzen SierectionProcess.EnableRaisingEvents = true
quelle
Ich bin auf Beispiele gestoßen, die
new Process()
in einerusing
Klausel stehen. Tun Sie das nicht, wenn Sie die Funktion verwenden möchtenExited
. Dieusing
Klausel zerstört die Instanz zusammen mit allen EreignishandlesExited
.Dies...
Sollte das sein ...
quelle