如何确保在崩溃c#时保存应用程序状态

本文关键字:保存 应用 程序状态 崩溃 何确保 确保 | 更新日期: 2023-09-27 18:25:07

我对c#编程很陌生,所以请记住:

我有一个内存中的数据对象,其中包含我需要在应用程序崩溃或关闭时保存信息的数据。有没有一种方法可以坚定地或可靠地做到这一点?

我一直在看自毁

~MyObjectName(){}

终结器和Dispose(),

但据我所知,这些都不会可靠地满足我的要求?

目前我正在使用析构函数,当我关闭程序时它可以工作,但这并不意味着它会在崩溃时工作,或者总是工作。

我也应该看看活动吗?

如何确保在崩溃c#时保存应用程序状态

当进程(任何进程,而不仅仅是.Net进程)终止时,没有100%可靠的机制可以用来保存数据(或做任何其他事情)-大多数进程都可以在任何时候使用任务管理器中的"结束进程"选项终止,当这种情况发生时,进程会立即终止。作为一个更极端的例子,电源线可以从机器的背面拔出。

如果该数据对象不是100%必须是最新的并在进程终止后保存,那么AppDomain.UnhandledException事件可能就足够了。

如果这种情况绝对是100%必要的,那么您需要在流程运行时不断保存这些信息——绝对不能保证您以后有机会这样做。这就是数据库的操作方式,在某些更改记录以某种格式(例如事务日志)记录到磁盘之前,不会返回任何事务。这就是ACID中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窗体应用程序中)。

UnhandledException事件处理从主UI线程。ThreadException事件处理未捕获的从非UI线程引发的异常。

您可以使用windbg实现这一点。

  1. 在windbg中的zterminateProcess方法中保留一个断点。当您的应用程序退出时,将调用此方法
  2. 当到达断点时,使用!dumpmap-键入MyObjectName以获取对象的地址
  3. 使用!dumpobject"MyObjectName的地址"以了解对象内部的值