Как правильно обрабатывать выход из системы / выключение / перезапуск, когда приложение имеет несохраненные данные? - PullRequest
4 голосов
/ 11 марта 2009

В 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 закрыта или перезагружена (она не различает их).

Итак, что моя программа должна делать с событием окончания сеанса? Должен ли он вообще что-то делать или ничего не делать на этом мероприятии - это стандарт?

Пользователю предлагается сохранить свои изменения в методе OnClosing моей основной формы, чтобы он не терял данные, но я думаю, что окно "приложение не отвечает" не предлагает нормальный рабочий процесс.

Отмена выключения нежелательна, я думаю, потому что некоторые другие программы уже были закрыты.

1 Ответ

5 голосов
/ 11 марта 2009

То, что кажется приемлемым способом, - это отображение диалога сохранения в любом случае.

Отмена выключения, затем возобновление его позже, скорее всего, не вариант, по той причине, о которой вы говорите, и по другим причинам.

Поскольку недопустимо просто отбрасывать данные, других вариантов действительно нет.

Ну, кроме как сохранить данные во временный файл, а затем автоматически восстановить их при следующем запуске программы. Скорее как MS Word после того, как он разбился. На самом деле, чем больше я это рассматриваю, тем лучше звучит.

Редактировать: Есть еще один путь, а именно: непрерывно экономить, например. MS OneNote делает. Что меня поразило раньше, так это то, что при условии, что вы внедрили достойную многоуровневую отмену в своем приложении, весь бизнес, связанный с ручным сохранением, на самом деле несколько устарел - анахронизм со времен, когда дисковые операции были дорогими и подверженными ошибкам, в настоящее время в основном старой привычкой.

Но я отвлекся. В любом случае, это, вероятно, не применимо к вашему приложению, так как я предполагаю, что это нужно реализовать с самого начала.

...