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