Frage

Ich bin sehr neu in der C# -Programmierung, so dass ich: das im Auge:

Ich habe ein In-Memory-Datenobjekt mit Daten. Gibt es eine Möglichkeit, dies deterministisch oder zuverlässig zu tun?

Ich habe mir Destruktoren angesehen

~MyObjectName(){}

Finalizer und dispose (),,

Aber soweit ich verstehe, wird nichts davon zuverlässig tun, was ich will?

Derzeit benutze ich den Destruktor, und es funktioniert, wenn ich das Programm schließe, aber das bedeutet nicht, dass es beim Absturz oder immer funktioniert.

Sollte ich mir auch Veranstaltungen ansehen?

War es hilfreich?

Lösung

Es gibt nein 100% zuverlässiger Mechanismus, mit dem Sie Daten speichern können (oder etwas anderes für diese Angelegenheit tun), wenn ein Prozess (jeder Prozess, nicht nur ein .NET -Prozess) endet - die meisten Prozesse können an jedem Punkt mit dem "Endprozess" beendet werden. Option im Task -Manager, wenn dies geschieht, wird der Prozess sofort getötet. Als extremeres Beispiel konnte das Netzkabel die Rückseite der Maschine herausgezogen werden.

Wenn es nicht zu 100% erforderlich ist, dass dieses Datenobjekt auf dem neuesten Stand ist und gespeichert wird, sobald der Prozess getötet ist, dann die Appdomain.unhandleDexception Ereignis kann ausreichen.

Wenn es absolut 100% erforderlich ist, dass dies der Fall ist, müssen Sie diese Informationen kontinuierlich speichern, wenn der Prozess ausgeführt wird - es gibt absolut keine Garantie, dass Sie die Chance haben, dies zu einem späteren Zeitpunkt zu tun. Auf diese Weise arbeiten Datenbanken, keine Transaktion kehrt zurück, bis einige Aufzeichnungen über die Änderung in einem Format in einem Format aufgezeichnet wurden (z. B. ein Transaktionsprotokoll). Das ist es, wofür das D steht in SÄURE.

Andere Tipps

Ich glaube, Sie suchen nach unbundetierten Ausnahmen? etwas wie das:

static void Main()
{
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);

  Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

  Application.Run(new Form1());
}

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
  MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception");
  // here you can log the exception ...
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
  MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");
  // here you can log the exception ...
}

In diesem Beispiel wird angezeigt, wie alle Ausnahmen verwaltet werden, die in den Abschnitten Try-Catch-Abschnitte nicht gefangen wurden (in Windows Forms-Anwendung).

Das Ereignis in Unverandledexception behandelt ungewöhnliche Ausnahmen aus dem Haupt -UI -Thread. Das ThreadException-Ereignis erledigt unbefestigte Ausnahmen aus Nicht-UI-Threads.

Sie können dies mit Windbg erreichen.

  1. Halte ein Haltepunkt bei der TwterateProcess -Methode in Windbg. Diese Methode wird aufgerufen, wenn Ihre Anwendung beendet ist.
  2. Wenn der Haltepunkt erreicht ist, verwenden Sie den MyObjectName vom Typ Dumpheap -Typ, um die Adresse Ihres Objekts zu erhalten
  3. Verwenden Sie! DumpObject "Adresse von MyObjectName", um die Werte im Objekt zu kennen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top