In WPF muss App.Current.SessionEnding in einigen Sekunden zurückgegeben werden, andernfalls wird das Fenster "Anwendung reagiert nicht" angezeigt. Daher kann der Benutzer in diesem Ereignishandler nicht aufgefordert werden, seine Daten zu speichern, da die Antwort des Benutzers länger als einige Sekunden dauert.Was ist die richtige Methode für die Abmeldung/das Herunterfahren/Neustarten, wenn die Anwendung nicht gespeicherte Daten enthält?
Ich dachte, eine Lösung wäre, die Abmelde/Shutdown/Neustart abzubrechen, und es wieder aufnehmen, wenn der Benutzer auf die Datei speichern Dialog beantwortet.
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 ?
}
Das Problem ist, dass ReasonSessionEnding mir nicht sagen, ob Windows war herunterzufahren oder neu zu starten (es unterscheidet nicht zwischen den beiden).
Also, was sollte mein Programm für das Session-Ending-Event tun? Sollte es überhaupt etwas tun, oder nichts an diesem Event machen ist der Standard?
Der Benutzer wird gebeten, seine Änderungen in der OnClosing-Methode des Hauptformulars zu speichern, damit er keine Daten verliert, aber ich denke, dass das Fenster "Anwendung reagiert nicht" keinen normalen Workflow vorschlägt.
das Herunterfahren abbrechen nicht erwünscht Ich denke, da einige der anderen Programme nach unten bereits geschlossen wurden.
+1. Wenn Sie können, speichern Sie sie an einem bekannten temporären Speicherort. Dies ist die beste Option in meinen Büchern. –