Wie kann ich sagen, wenn .Net-System.Diagnose.Prozess erfolgreich ausgeführt wurde oder fehlgeschlagen ist?

StackOverflow https://stackoverflow.com/questions/155540

  •  03-07-2019
  •  | 
  •  

Frage

Ich Schreibe einen scheduler oder Sorten.Es ist im Grunde eine Tabelle mit einer Liste von EXE-Dateien (wie "C:\a.exe") und ein Konsole-app schaut die Datensätze in der Tabelle werden jede minute oder so und führt die Aufgaben, die noch nicht laufen, noch nicht.

Ich führe die Aufgaben wie diese:

System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = someExe; // like "a.exe"
p.Start();

Wie kann ich feststellen, ob eine bestimmte Aufgabe gescheitert sind?Zum Beispiel, was, wenn a.exe wirft eine nicht behandelte Ausnahme?Ich möchte den obigen code, um zu wissen, Wann dies geschieht, und aktualisieren Sie die tasks-Tabelle mit so etwas wie "die Besondere Aufgabe gescheitert", etc.

Wie kann ich dies tun?

Ich bin nicht mit der Sql-Agent oder den Windows-Taskplaner, weil jemand anderes sagte mir nicht zu.Er hat mehr "Erfahrung" so bin ich im Grunde nur die folgenden Aufträge.Fühlen Sie sich frei, um alternativen vorzuschlagen.

War es hilfreich?

Lösung

Sie können die Win32Exception zu überprüfen, ob Process.Start () scheiterte nicht auf den Dateizugriff vorhandene oder ausführen verweigert wird.

Sie können aber keine Ausnahmen von den Prozessen geworfen fangen, dass Sie diese Klasse erstellen verwenden. In erster Linie kann die Anwendung nicht in .NET geschrieben werden, so gibt es kein Konzept der Ausnahme überhaupt sein könnte.

Was Sie tun können, ist zu überprüfen auf der Exitcode von der Anwendung oder lesen Sie die StandardOutput und Standarderror strömt, ob Fehlermeldungen überprüfen gebucht werden.

Andere Tipps

Ich glaube, du bist für Process.ExitCode suchen, vorausgesetzt, der Prozess kehrt ein. Möglicherweise müssen WaitForExit () verwenden, though. Es gibt auch ein ErrorDataReceived Ereignis, das ausgelöst wird, wenn eine App auf stderr sendet.

Neben den Exitcode, können Sie auch etwas tun:

string output = p.StandardOutput.ReadToEnd();

Das wird alles erfassen, die zu einem Befehlsfenster geschrieben worden wären. Dann können Sie diese Zeichenfolge für bekannte Muster analysieren für Fehler anzeigt, abhängig von der Anwendung.

Zu erweitern auf das, was @jop sagte.Sie müssen auch warten, bis der Prozess zu schließen.Also:

        p.Start();
        p.WaitForExit();
        int returnCode = p.ExitCode;

Nicht-null-codes, die sind in der Regel Fehler.Einige Anwendungen verwenden negativen Fehler, und die positiven status-codes/Warnungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top