2009-03-11 6 views
4

Dans WPF App.Current.SessionEnding doit retourner dans quelques secondes, sinon la fenêtre «application ne répond pas» s'affiche. L'utilisateur ne peut donc pas être invité dans ce gestionnaire d'événements à sauvegarder ses données, car la réponse de l'utilisateur prend plus de quelques secondes.Quelle est la bonne façon de gérer la déconnexion/l'arrêt/le redémarrage lorsque l'application a des données non sauvegardées?

Je pensais qu'une solution serait d'annuler la fermeture de session/arrêt/redémarrage, et de le reprendre lorsque l'utilisateur a répondu à la boîte de dialogue de sauvegarde de fichier.

ReasonSessionEnding _reasonSessionEnding; 

    App.Current.SessionEnding += 
     new SessionEndingCancelEventHandler(Current_SessionEnding); 

    void Current_SessionEnding(object sender, SessionEndingCancelEventArgs e) 
    { 
     if (_dataModified) 
     { 
      e.Cancel = true; 
      _reasonSessionEnding = e.ReasonSessionEnding; 
      Dispatcher.CurrentDispatcher.BeginInvoke(new Action(EndSession)); 
     } 
    } 

    void EndSession() 
    { 
     if (SaveWithConfirmation()) // if the user didn't press Cancel 
      //if (_reasonSessionEnding = ReasonSessionEnding.Logoff) 
       // logoff 
      //else 
       // shutdown or restart ? 
    } 

Le problème est que ReasonSessionEnding ne me dit pas si Windows était arrêt ou le redémarrage (il ne fait pas de distinction entre les deux). Alors, que devrait faire mon programme sur l'événement de fin de session? Devrait-il même faire quelque chose, ou ne rien faire sur cet événement est la norme?

L'utilisateur est invité à sauvegarder ses modifications dans la méthode OnClosing de mon formulaire principal, afin qu'il ne perde pas de données, mais je pense que la fenêtre "application ne répond pas" ne suggère pas un workflow normal.

L'annulation de l'arrêt n'est pas souhaitée, je suppose, car certains des autres programmes ont déjà été arrêtés.

Répondre

5

Ce qui semble être la méthode acceptée est d'afficher la boîte de dialogue Enregistrer sous.

Annulation de l'arrêt, puis la reprise plus tard n'est certainement pas une option, pour la raison que vous énoncez et divers autres.

Étant donné que le simple fait de supprimer les données est inacceptable, il n'y a pas vraiment d'autres options.

Eh bien, sauf pour enregistrer les données dans un fichier temporaire, puis les restaurer automatiquement la prochaine fois que le programme est exécuté. Plutôt comme MS Word après son crash. En fait, plus je le considère, mieux ça sonne.

Editer: Il y a encore une autre avenue, à savoir pour économiser en permanence, la façon par exemple. MS OneNote fait. Ce qui m'a frappé avant, c'est que, à condition d'implémenter une annulation correcte à plusieurs niveaux dans votre application, toute l'activité de sauvegarde manuelle est un peu datée - un anachronisme du temps où les opérations sur disque étaient coûteuses et sujettes aux erreurs.

Mais je digresse. Quoi qu'il en soit, cela ne s'applique probablement pas à votre application, car j'imagine que cela doit être mis en œuvre dès le début.

+0

+1. Si vous le pouvez, enregistrez dans un emplacement temporaire connu. C'est la meilleure option dans mes livres. –

Questions connexes