Как обеспечить сохранение состояния заявки на аварию C#
-
27-10-2019 - |
Вопрос
Я очень новичок в программировании 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.
- Держать точка останова В методе ZwterminateProcess в WindBG. Этот метод будет вызван, когда ваше приложение выходит.
- Когда точка останова достигнута, используйте! DumpHeap -Type MyObjectName, чтобы получить адрес вашего объекта
- Используйте! Dillobject «Адрес MyObjectName», чтобы узнать значения внутри объекта