從Vista 到Windows 7 這兩款作業系統都帶有應用程式恢複和重啟(ARR)功能,利用這個特性可以在應用程式處於無響應甚至崩潰狀態時,儲存當前正在處理的資料,並將應用程式以及之前的資料恢複。本篇我們將利用Windows API Code Pack 來實現這一功能。
首先,我們來建立一個簡單的WPF程式。在應用程式載入時需要註冊(Register)ARR,當應用程式關閉時也需要將ARR登出。
<Window x:Class="AppRestartRecovery.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <Button x:Name="crashBtn" Content="Application Crash" Margin="169,104,172,168" Click="crashBtn_Click"/> <Button x:Name="closeBtn" Content="Close Application" Margin="169,189,172,83" Click="closeBtn_Click"/> </Grid></Window>
註冊ARR
public MainWindow(){ InitializeComponent(); RegisterForRestartRecovery(); ... ...}
登出ARR
private void closeBtn_Click(object sender, RoutedEventArgs e){ UnRegisterRestartRecovery(); App.Current.Shutdown();}
在項目中加入Microsoft.WindowsAPICodePack.dll,並添加using Microsoft.WindowsAPICodePack.ApplicationServices; 命名空間。接下來我們開始編寫RegisterForRestartRecovery 和UnRegisterRestartRecovery 方法。
在RegisterForRestartRecovery 方法中要分別建立Restart 和Recovery 設定(Settings)。在RestartSettings 中可以設定命令列(“restart”),以及Restart 限制條件。在本例中如果應用程式崩潰是因為PC 重啟或安裝系統補丁則不會發生Restart 功能。最後要通過ApplicationRestartRecoveryManager 類將Restart 和Recovery 設定分別註冊。
private void RegisterForRestartRecovery(){ RestartSettings restartSettings = new RestartSettings("restart", RestartRestrictions.NotOnReboot | RestartRestrictions.NotOnPatch); ApplicationRestartRecoveryManager.RegisterForApplicationRestart(restartSettings); RecoveryData data = new RecoveryData(new RecoveryCallback(PerformRecovery), null); RecoverySettings recoverySettings = new RecoverySettings(data, 0); ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(recoverySettings);}
登出方式使用UnregisterApplicationRestar和 UnregisterApplicationRecovery 兩種方法即可。
private void UnRegisterRestartRecovery(){ ApplicationRestartRecoveryManager.UnregisterApplicationRestart(); ApplicationRestartRecoveryManager.UnregisterApplicationRecovery();}
在應用程式恢複過程中還需要編寫一個恢複過程,即RegisterForRestartRecovery 方法提到的PerformRecovery。首先可以通過ApplicationRecoveryInProgress 方法判斷恢複過程是否在進行。如果恢複過程被使用者取消了,則可以將應用程式進程殺掉,並通過ApplicationRecoveryFinished 方法設定恢複過程是否完成。
private int PerformRecovery(object state){ bool isCanceled = ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress(); if (isCanceled) { ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(false); } //recovery your work here ... ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(true); return 0;}
至此,應用程式的恢複就完成了,大家可以下載代碼進行測試。另,當程式啟動後要等待60秒再點擊“Application Crash” 按鍵。
源碼下載
AppRestartRecovery.zip