Hallo,
in meiner Anwendung muss ich häufig externe Programme starten und deren Rückgabe auswerten. Dafür habe ich mir folgende Funktion geschrieben:
private int StartProgram(string ProgramFileName, string Arguments)
{
Process proc = new Process();
proc.StartInfo.FileName = ProgramFileName;
proc.StartInfo.Arguments = Arguments;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
proc.WaitForExit();
int result = proc.ExitCode;
proc.Close();
return result;
}
Dies läuft auch reibungslos. Nun muss ich allerdings Programme aufrufen, die sich hin und wieder aufhängen und einfach einen Rückgabewert liefert - Endlosschleife eben. Dies hat zur Folge, dass sich auch mein Programm "aufhängt", da "proc.WaitForExit" niemals endet.
Nun möchte ich die Funktion gern so erweitern, dass ein "int Timeout" übergeben wird. Wenn WaitForExit nach Timeout-Sekunden nicht abgearbeitet wurde, dann soll das externe Programm geschlossen werden und die StartProgram-Funktion sauber durchlaufen.
Hat jemand eine Idee, wie dies funktionieren kann? Stehe da grad was auf dem Schlauch 😃
Dankend
Stefan
Hallo S.R.,
anstatt mit WaitForExit zu warten kannst du das ganze auch Eventbasiert machen.
Dazu musst du einfach eine Variable setzen und kannst dann das Exited-Event registrieren.
myProcess.EnableRaisingEvents = true;
myProcess.Exited += new EventHandler(myProcess_Exited);
Hier der MSDN Link dazu: Process.Exited-Ereignis
Somit kannst du dir selbst ein Timeout basteln (timer) und dann das Event unregistern (-=)
Gruss
Michael
Hallo,
du kannst auch die WaitForExit-Überladung verwenden, die einen TimeOut annimmt (hast du vermutlich übersehen):
public static int StartProgram(string fileName, string arguments, int timeout)
{
Process process = Process.Start(fileName, arguments);
process.WaitForExit(timeout);
process.Refresh();
if (!process.HasExited)
{
process.Kill();
return -1;
}
return process.ExitCode;
}
spooky
Hi,
@Spook:
Das muss ich tatsächlich übersehen haben 😃 Wenn das klappt, dann wär's echt suuuuper einfach grins
Danke - wird sofort getestet happy
Stefan
Hallo S.R.,
Wenn WaitForExit nach Timeout-Sekunden nicht abgearbeitet wurde, dann soll das externe Programm geschlossen werden
nur zur Sicherheit: Der TimeOut von WaitForExit bezieht sich aber nur darauf, wie lange WaitForExit maximal warten soll. Das bedeutet jedoch nicht, dass das externe Programm automatisch geschlossen wird. Das muss wie im Code von Spook explizit mit Kill erfolgen.
herbivore