当应用程序有未保存的数据时,处理注销/关闭/重启的正确方法是什么?

时间:2009-03-11 00:30:47

标签: c# wpf shutdown

在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 个答案:

答案 0 :(得分:5)

似乎可接受的方式是无论如何都显示另存为对话框。

取消关闭,然后稍后恢复它肯定不是一个选项,因为你声明和其他各种原因。

由于简单地丢弃数据是不可接受的,因此实际上没有其他选择。

好吧,除了将数据保存到临时文件,然后在下次运行程序时自动恢复它们。它就像MS Word一样崩溃了。实际上,我越是考虑它,听起来就越好。

编辑:还有另一条途径,即不断保存,例如。 MS OneNote可以。令我印象深刻的是,如果你在你的应用程序中实现了不错的多级撤消,那么整个手动存储业务实际上已经过时了 - 从磁盘操作昂贵且容易出错的时代来看,这是一种时代错误,现在大多是旧习惯。

但我很离题。无论如何,它可能不适用于您的应用程序,因为我认为它需要从一开始就实现。

相关问题