应用程序恢复和重启 C# 快速参考






4.95/5 (25投票s)
应用程序恢复和重启 C# 快速参考
背景
应用程序恢复与重启 (ARR) 是一项功能,允许您为应用程序崩溃或永远等待(“未响应”)这种不可能的(?)情况做好准备。
该功能允许您为这些情况进行“注册”,以便让您有机会在程序结束其生命周期之前保存应用程序数据或执行一些清理操作。
此功能自 Windows Vista 起就已存在,但似乎知道的人不多,因此让我们看看如何使用 Windows API Code Pack 轻松地将 ARR 集成到您的应用程序中。
有关该功能的更多信息,请参见 MSDN 上的应用程序恢复与重启。
步骤 1 – 何时注册?
第一步显而易见,但仍然需要说明。您应该在应用程序加载时注册 ARR,并在应用程序卸载时取消注册。
public MainWindow()
{
InitializeComponent();
...
RegisterApplicationRecoveryAndRestart();
}
private void CloseButton_Click(object sender, RoutedEventArgs e)
{
...
UnregisterApplicationRecoveryAndRestart();
App.Current.Shutdown();
}
函数 RegisterApplicationRecoveryAndRestart
和 UnregisterApplicationRecoveryAndRestart
是我的函数,我们将在下一步看到。
步骤 2 – 如何注册?
在使用 ARR 功能之前,我们使用 WindowsAPICodePack CoreHelper.RunningOnVista
辅助方法检查我们是否在 Windows Vista 或更高版本上运行。
private void RegisterApplicationRecoveryAndRestart()
{
if (!CoreHelpers.RunningOnVista)
{
return;
}
// register for Application Restart
RestartSettings restartSettings =
new RestartSettings(string.Empty, RestartRestrictions.None);
ApplicationRestartRecoveryManager.RegisterForApplicationRestart(restartSettings);
// register for Application Recovery
RecoverySettings recoverySettings =
new RecoverySettings(new RecoveryData(PerformRecovery, null), KeepAliveInterval);
ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(recoverySettings);
}
注册重启
然后我们做两件事。首先,我们注册重启。如果应用程序出现未处理的异常或无响应超过 60 秒,Windows 错误报告组件将向用户显示重启对话框。
在注册重启时,我们提供一个 RestartSettings
的实例。它的第一个参数是重启时将使用的命令行参数,以防我们想要定义一些特殊参数(例如“以安全模式运行”)。第二个参数是一个 enum
,允许我们在某些情况下限制重启,例如,如果我们不希望我们的应用程序在计算机因系统更新而重启时重启,我们可以设置 RestartRestriction.NotOnReboot
。
可用的限制是
限制 | 含义 |
无 | 无重启限制 |
NotOnCrash | 如果进程由于未处理的异常而终止,则不要重启该进程。 |
NotOnHang | 如果进程由于应用程序未响应而终止,则不要重启该进程。 |
NotOnPatch | 如果进程由于安装更新而终止,则不要重启该进程。 |
NotOnReboot | 如果计算机由于更新而重启,则不要重启该进程。 |
注册恢复
我们要做的第二件事是注册恢复。这意味着,如果应用程序需要重启(与之前的原因相同),我们希望运行什么函数以允许稍后恢复。
在注册恢复时,我们提供一个 RecoverySettings
的实例。它的第一个参数是 RecoveryData
对象,它包装了一个要调用的委托和一些将被传递的状态参数(在本例中为 null
)。第二个参数是保持活动间隔,这将在稍后解释。
实现恢复函数
恢复函数应遵循一些规则,以避免应用程序(再次)陷入恢复函数中。您必须每隔几(毫)秒调用 ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress
(在示例中,KeepAliveInterval = 5000
)。 这告诉 ARR 机制,“我知道这需要一些时间,但别担心,我还活着并且正在进行恢复工作”。
此外,在恢复函数的末尾,您必须调用 ApplicationRestartRecoveryManager.ApplicationRecoveryFinished
,并使用一个参数来指示您是否成功完成了恢复。
/// <summary>
/// Performs recovery by saving the state
/// </summary>
/// <param name="parameter">Unused.</param>
/// <returns>Unused.</returns>
private int PerformRecovery(object parameter)
{
try
{
ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress();
// Save your work here for recovery
...
ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(true);
}
catch
{
ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(false);
}
return 0;
}
步骤 3 – 如何取消注册
private void UnregisterApplicationRecoveryAndRestart()
{
if (!CoreHelpers.RunningOnVista)
{
return;
}
ApplicationRestartRecoveryManager.UnregisterApplicationRestart();
ApplicationRestartRecoveryManager.UnregisterApplicationRecovery();
}
这只是一些清理代码,用于正确地从应用程序恢复和重启中取消注册。
暂时就到这里,
Arik Poznanski