Как обеспечить сохранение состояния заявки на аварию C#

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

Вопрос

Я очень новичок в программировании C#, так что это так:

У меня есть объект данных в памяти с данными, которые мне нужно сохранить информацию, когда (если) мое приложение было сбоем или закрыто. Есть ли способ сделать это детерминистически или надежно?

Я смотрел на деструкторы

~MyObjectName(){}

финализаторы и распоряжение (),

Но, насколько я понимаю, никто из них не сделает надежно то, что я хочу?

В настоящее время я использую деструктор, и он работает, когда я закрываю программу, но это не значит, что он будет работать при сбое или всегда.

Должен ли я смотреть на события?

Это было полезно?

Решение

Есть нет 100% надежный механизм, который вы можете использовать для сохранения данных (или делать что -либо еще в этом отношении), когда процесс (любой процесс, а не только процесс .NET) завершается - большинство процессов могут быть прекращены в любой точке с использованием «конечного процесса» Опция в диспетчере задач, когда это происходит, процесс сразу же убит. В качестве более крайнего примера шнур питания можно вытащить заднюю часть машины.

Если на 100% не необходимо, чтобы этот объект данных был актуальным и сохраненным после убийства процесса, тогда Appdomain.unhandledexcection событие может быть достаточно.

Если это абсолютно на 100% необходимо, чтобы это было так, то вам нужно постоянно сохранять эту информацию, поскольку процесс работает - абсолютно нет Гваранти, что у вас будет возможность сделать это позже. Вот как работают базы данных, ни одна транзакция не возвращается, пока в каком -то формате не будет зарегистрирована некоторая запись об изменении (например, журнал транзакций). Это то, что означает D в КИСЛОТА.

Другие советы

Я считаю, что вы ищете невозможные исключения? что-то вроде этого:

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 ...
}

В этом примере показано, как управлять всеми исключениями, которые не были пойманы в разделах Try-Catch (в приложении Windows Forms).

Событие UnkledledExcection обрабатывает непредучанные исключения, выброшенные из основного потока пользовательского интерфейса. Событие ThreadException обрабатывает непредучанные исключения, выброшенные из нитей, не связанных с UI.

Вы можете достичь этого с помощью WindBG.

  1. Держать точка останова В методе ZwterminateProcess в WindBG. Этот метод будет вызван, когда ваше приложение выходит.
  2. Когда точка останова достигнута, используйте! DumpHeap -Type MyObjectName, чтобы получить адрес вашего объекта
  3. Используйте! Dillobject «Адрес MyObjectName», чтобы узнать значения внутри объекта
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top