我对 c# 编程很陌生,所以请记住:
我有一个内存数据对象,其中包含我需要在(如果)我的应用程序崩溃或关闭时保存信息的数据。有没有办法确定或可靠地做到这一点?
我一直在看析构函数
~MyObjectName(){}
终结器和 Dispose(),
但据我了解,这些都不能可靠地满足我的要求?
目前我正在使用析构函数,当我关闭程序时它可以工作,但这并不意味着它会在崩溃时工作,或者总是。
我也应该关注事件吗?
我对 c# 编程很陌生,所以请记住:
我有一个内存数据对象,其中包含我需要在(如果)我的应用程序崩溃或关闭时保存信息的数据。有没有办法确定或可靠地做到这一点?
我一直在看析构函数
~MyObjectName(){}
终结器和 Dispose(),
但据我了解,这些都不能可靠地满足我的要求?
目前我正在使用析构函数,当我关闭程序时它可以工作,但这并不意味着它会在崩溃时工作,或者总是。
我也应该关注事件吗?
当进程(任何进程,而不仅仅是 .Net 进程)终止时,没有 100% 可靠的机制可用于保存数据(或为此执行任何其他操作) - 大多数进程可以在任何时候使用“任务管理器中的“结束进程”选项,当发生这种情况时,进程会立即被终止。作为一个更极端的例子,可以将电源线从机器背面拉出。
如果不是 100% 需要此数据对象是最新的并在进程被终止后保存,那么AppDomain.UnhandledException 事件可能就足够了。
如果绝对 100% 需要这种情况,那么您需要在流程运行时不断保存此信息 - 绝对不能保证您以后有机会这样做。这就是数据库的操作方式,直到某些更改记录以某种格式(例如事务日志)记录到磁盘后,才会返回任何事务。这就是 D 在ACID中的含义。
我相信您正在寻找捕获未处理的异常?像这样的东西:
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 实现此目的。