WPF App.Current.SessionEnding では、数秒で戻る必要があります。そうしないと、「アプリケーションが応答しません」というウィンドウが表示されます。したがって、ユーザーの応答には数秒以上かかるため、このイベント ハンドラーでデータを保存するようユーザーに要求することはできません。
解決策は、ログオフ/シャットダウン/再起動をキャンセルし、ユーザーがファイル保存ダイアログに応答したときに再開することだと思いました。
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 ?
}
問題は、ReasonSessionEnding が、Windows がシャットダウン中か再起動中かを教えてくれないことです (この 2 つを区別しません)。
では、セッション終了イベントで私のプログラムは何をすべきでしょうか? それは何かをするべきですか、それともこのイベントで何もしないのが標準ですか?
ユーザーはメイン フォームの OnClosing メソッドで変更を保存するように求められるため、データが失われることはありませんが、「アプリケーションが応答しません」というウィンドウは通常のワークフローを示唆していないと思います。
他のプログラムのいくつかはすでにシャットダウンされているため、シャットダウンのキャンセルは望ましくないと思います。