Laden...

externes Programm mit Timeout starten

Erstellt von S.R. vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.973 Views
S
S.R. Themenstarter:in
221 Beiträge seit 2007
vor 13 Jahren
externes Programm mit Timeout starten

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

3.430 Beiträge seit 2007
vor 13 Jahren

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

S
248 Beiträge seit 2008
vor 13 Jahren

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

S
S.R. Themenstarter:in
221 Beiträge seit 2007
vor 13 Jahren

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

49.485 Beiträge seit 2005
vor 13 Jahren

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