Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当应用程序有未保存的数据时,处理注销/关闭/重新启动的正确方法是什么?_C#_Wpf_Shutdown - Fatal编程技术网

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

C# 当应用程序有未保存的数据时,处理注销/关闭/重新启动的正确方法是什么?,c#,wpf,shutdown,C#,Wpf,Shutdown,在WPF中,App.Current.SessionEnding必须在几秒钟后返回,否则会出现“应用程序不响应”窗口。因此,无法在此事件处理程序中要求用户保存其数据,因为用户的响应时间超过几秒钟 我认为解决方案是取消注销/关闭/重新启动,并在用户响应文件保存对话框时恢复 ReasonSessionEnding _reasonSessionEnding; App.Current.SessionEnding += new SessionEndingCancelEven

在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方法中保存他的更改,这样他就不会丢失数据,但我认为“应用程序不响应”窗口不建议使用正常的工作流


我想取消关机是不可取的,因为其他一些程序已经关机了。

似乎可以接受的方式是显示“另存为”对话框

由于您陈述的原因和其他各种原因,取消关机,然后稍后恢复关机肯定不是一个选项

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

嗯,除了将数据保存到临时文件,然后在下次程序运行时自动恢复它们。就像Word崩溃后的微软一样。事实上,我越认为它越好。< /P> 编辑:还有另一种方法,即像MS OneNote那样持续保存。以前让我印象深刻的是,如果您在应用程序中实现适当的多级撤销,那么整个手动保存业务实际上已经有些过时了——这与磁盘操作昂贵且容易出错的时代相比是一个时代错误,而现在大多数都是旧习惯


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

+1。如果可以,请保存到已知的临时位置。这是我书中最好的选择。