Я согласен с @Jerry в том, что более важно избегать запроса на сохранение, если данные не изменились с момента последнего сохранения. Я обычно использую простой «измененный» флаг, который устанавливается при любом действии редактирования и очищается при сохранении и загрузке.

у то, что сводится к редактору документов. Когда приложение закрывается, мне нужно предложить пользователю сохранить изменения. Это достаточно просто. Мой вопрос, когда это уместноне предложить пользователю, а вместо этого просто отбросить несохраненные данные и закрыть.

В событии FormClosing перечисление CloseReason включает:

НиктоWindowsShutDownMdiFormClosingUserClosingTaskManagerClosingFormOwnerClosingApplicationExitCall

Я считаю, что WindowsShutDown и TaskManagerClosing не должны вызывать "сохранить изменения?" появится, чтобы приложение не зависало при отображении этого приглашения.

Это стандартная практика, или я должен делать что-то еще здесь?

Для ясности вот код:

protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing(e);

    if (!(e.CloseReason == CloseReason.WindowsShutDown || e.CloseReason == CloseReason.TaskManagerClosing)
            && this.ChangesPending())
    {
        switch (MessageBox.Show(this, "Save changes?", "Save Changes", MessageBoxButtons.YesNoCancel))
        {
            case DialogResult.Yes:
                this.Save();
                break;
            case DialogResult.No:
                // Do nothing
                break;
            case DialogResult.Cancel:
                e.Cancel = true;
                break;
        }
    }
}

Ответы на вопрос(5)

Ваш ответ на вопрос