Windows 7 應用程式崩潰恢複

來源:互聯網
上載者:User

     從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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.