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.
+1. Si vous le pouvez, enregistrez dans un emplacement temporaire connu. C'est la meilleure option dans mes livres. –