Meine C # -Anwendung gibt 0xE0434352 an Windows Task Scheduler zurück, stürzt jedoch nicht ab

76

Ich habe einige C # -Apps geschrieben, die über den Windows-Taskplaner ausgeführt werden. Sie werden erfolgreich ausgeführt (wie aus den Protokolldateien hervorgeht, die sie schreiben), aber der Windows-Taskplaner zeigt an, dass sie ein Ergebnis der letzten Ausführung von zurückgeben 0xE0434352. Muss ich in meiner C # -Anwendung etwas tun, damit ein Erfolgscode an den Windows-Taskplaner zurückgegeben wird?

Kynrek
quelle
Was macht deine Aufgabe?
Ta01
Die Task führt meine C # -Anwendung mit dem Argument -a aus. Die Anwendung wird wie gewohnt ausgeführt und stürzt nicht ab. Daher bin ich mir nicht sicher, warum Windows Scheduler einen Fehlercode empfängt.
Kynrek
48
Ihre Annahme, dass es nicht abstürzt, ist nicht richtig. 0xe0434352 ist ein CLR-Ausnahmecode auf niedriger Ebene. Schreiben Sie einen Ereignishandler für AppDomain.CurrentDomain.UnhandledException und protokollieren Sie den Wert von e.ExceptionObject.ToString ()
Hans Passant
5
Danke Hans, du hattest Recht. Dieser Artikel half mir, den Even-Handler einzurichten,
Kynrek

Antworten:

88

Eine andere Möglichkeit besteht darin, einfach das Anwendungsprotokoll zu verwenden, auf das über die Windows-Ereignisanzeige zugegriffen werden kann. Der .NET-Fehler wird im Anwendungsprotokoll aufgezeichnet.

Sie können diese Ereignisse hier sehen:

Ereignisanzeige (lokal)> Windows-Protokolle> Anwendung

voidmain
quelle
+1: Dies ist viel einfacher, um den Fehler zu erkennen. In meinem Fall sollte meine Anwendung während einer Ausnahme eine E-Mail senden, und SMTP wurde in der Konfigurationsdatei nicht richtig konfiguriert. Selbst wenn das Programm nie zum catch-Block gegangen ist, ist der Fehler aufgetreten. Das Beheben der Konfiguration hat das Problem behoben.
Baz Guvenkaya
3
Das Ereignisprotokoll in meinem Fall enthielt eine Stapelverfolgung, die in der Tat sehr nützlich ist.
war
3
Beachten Sie, dass das Ereignisprotokoll möglicherweise zwei Fehler enthält, um absolut pedantisch zu sein. Konzentrieren Sie sich nicht nur auf die neueste. Die erste enthält möglicherweise interessantere Informationen.
RenniePet
1
In Win10 (vielleicht auch in anderen) lautet der Pfad in der Ereignisanzeige: Ereignisanzeige / Windows-Protokolle / Anwendung
MikeH
Die Stapelverfolgung der .NET-Ausnahme wird unter der Quelle.NET Runtime
riQQ
40

Wenn Sie einen Job in neuen Fenstern einrichten, haben Sie zwei Felder " Programm / Skript " und " Start in (optional) ". Geben Sie den Programmnamen an die erste und den Programmort an die zweite Stelle. Wenn Sie dies nicht tun und Ihr Programm nicht im Verzeichnis mit exe startet, findet es keine Dateien, die sich darin befinden.

Dmitry Bosikov
quelle
7
Genau. Wenn Sie in Ihrem Code relative Pfade verwenden, müssen Sie den Programmspeicherort angeben. Dies ist normalerweise der Pfad zur exe-Datei.
Jenny O'Reilly
Ich möchte nur darauf hinweisen, dass dies von MS sehr kontraintuitiv ist.
Carol
12

Ich habe auf ein zugeordnetes Laufwerk verwiesen und festgestellt, dass die zugeordneten Laufwerke nicht immer für das Benutzerkonto verfügbar sind, auf dem die geplante Aufgabe ausgeführt wird. Daher habe ich \\IPADDRESSstattdessen verwendet MAPDRIVELETTER:und bin betriebsbereit.

Randy Morris
quelle
Ich hatte ein ähnliches Problem, bei dem nicht auf den UNC-Netzwerkpfad zugegriffen werden konnte (verschiedene Benutzer), und ich habe versucht, mithilfe des Anmeldeinformationsmanagers die erforderlichen Kontoinformationen hinzuzufügen.
Dakab
7

Falls es anderen hilft, habe ich diesen Fehler erhalten, als der Dienst, auf dem die Aufgabe ausgeführt wurde, keine Schreibberechtigung für den ausführbaren Speicherort hatte. Es wurde versucht, dort eine Protokolldatei zu schreiben.

MDave
quelle
Dies war der eine. Meine Anwendung wurde in einen anderen Ordner als den Ordner geschrieben, in dem sie ausgeführt wurde.
MartinH
2

Ich hatte dieses Problem und es lag an der .Net-Framework-Version. Ich hatte den Build auf Framework 4.0 aktualisiert, aber dies schien einige Kommunikations-DLLs zu beeinflussen, die von der Anwendung verwendet wurden. Ich habe auf Framework 3.5 zurückgegriffen und es hat gut funktioniert.

user3936738
quelle
Ich muss meine Version herabstufen, aber dann erhalte ich den Fehler, viele DLLs neu zu installieren, und auch meine Website kann nicht ausgeführt werden.
Baymax
2

Ich habe den gleichen Fehler erhalten, aber ich habe ihn behoben, indem ich den Dateilesepfad von "ConfigFile.xml" in AppDomain.CurrentDomain.BaseDirectory.ToString () + "ConfigFile.xml" geändert habe.

In meinem Fall ist dieser Fehler auf einen Dateipfadfehler zurückzuführen, da der Task-Manager das Programm von "System32" als Anfangspfad startet, jedoch von dem Ordner, den wir dachten.

RUTIS
quelle
1

Ich habe dieselbe Nachrichtenmeldung in dotNet Core 2.2 mit MVC 5 erhalten, es wurde jedoch nichts in der Windows-Ereignisanzeige protokolliert.

Ich stellte fest, dass ich das Project sdk von Microsoft.NET.Sdk.Webin geändert hatte Microsoft.NET.Sdk.Razor(in der projects.csprojDatei zu sehen). Ich habe das wieder geändert und es hat gut funktioniert :)

MrBritton
quelle
0

In meinem Fall lag es daran, dass ich Nachrichtenboxen hatte. Nachdem ich diesen Code auskommentiert hatte, fing er an zu funktionieren. Ich erinnerte mich, dass dies ein Problem sein könnte, als ich mir das in diesem Thread vorgeschlagene Ereignisprotokoll ansah. Vielen Dank an alle!

Dean C.
quelle
0

Ich habe dieses Problem beim Arbeiten mit COM-Objekten festgestellt. Unter bestimmten Umständen (mein Fehler) habe ich einen externen EXE-Prozess zerstört. In einem parallelen Thread hat eine Variable versucht, auf die com-Schnittstelle app.method zuzugreifen, und es ist ein Absturz auf COM-Ebene aufgetreten. Der Taskplaner hat dies bemerkt und die App heruntergefahren. Wenn Sie die App jedoch in der Konsole ausführen und die Ausnahme nicht behandeln, funktioniert die App weiterhin ...

Bitte beachten Sie, dass Sie nicht verwalteten Code oder externe Objekte (AD, Socket, COM ...) überwachen müssen!

KUL
quelle
-1

In meinem Fall handelt es sich um ein Berechtigungsproblem. Der Taskplaner verfügt über einen Benutzer, der auf dem Server, auf dem die Datenbank vorhanden ist, keine Berechtigung hat.

Akash Vishwakarma
quelle