2011-01-05 15 views
1

Wenn unsere (Out Of Browser) Silverlight-Anwendung vom Benutzer heruntergefahren wird, erhalten wir manchmal eine AccessViolationException, wenn Sie versuchen, in eine Protokolldatei (in einem separaten Thread) zu schreiben. Es scheint, dass die Silverlight-Laufzeitumgebung heruntergefahren wird und keine IO-Vorgänge während der Abschaltsequenz erwartet werden.Wie kann ich eine AccessViolationException in Silverlight abfangen?

Der Versuch, AccessViolationException abzufangen und zu ignorieren, scheint nicht zu funktionieren, selbst wenn die Methode mit den HandleProcessCorruptedStateExceptions versehen ist, die erforderlich sind, um diese und andere Ausnahmen abzufangen, die wirklich unangenehme Fehler darstellen.

Gibt es eine noch leistungsfähigere Möglichkeit, eine Ausnahme abzufangen oder zumindest vor dem Benutzer zu verbergen?

+0

Sie können nicht mit AV umgehen, der Thread ist tot. Beheben Sie das eigentliche Problem. –

+1

@Hans, das "wahre Problem" ist Silverlight. Ich bin mir nicht sicher, was es beim Herunterfahren macht, aber was auch immer es ist - es sollte keine unangenehme Ausnahme machen. – SoftMemes

+0

bitte können sie ihren code posten, der die protokollierung durchführt? Es sieht so aus, als ob Sie versuchen, das Protokoll zu einer Datei hinzuzufügen, die bereits zum Schreiben geöffnet wurde. –

Antwort

0

Ich lief in eine sehr ähnliche Situation. Wenn der Benutzer die Anwendung beendet, wird die AccessViolationException ausgelöst. Die Ursache war, dass Code noch mit einem Hintergrund-Thread arbeitete und dieser Code logging (mit NLog).

Letztendlich wird NLog beim Versuch, einen FileStream zu erstellen, während silverlight runtime heruntergefahren wird, was den Fehler verursacht.

Wenn Sie Pause einschalten, wenn eine Ausnahmebedingung in Visual Studio (Strg + Alt + e) ​​ausgelöst wird, hilft es, zu lokalisieren.

Sobald ich das herausgefunden hatte, um zu beheben, musste ich sicherstellen, dass alle meine Hintergrundthreads gestoppt wurden, bevor die App beendet wurde. Das war nicht schlecht für mich, da ich MEF verwendet habe, konnte ich den Container einfach entsorgen und IDisposable wo nötig implementieren.