我正在开发一个需要节省计算机关机时间的应用程序,我需要确保总是计算机关机/重启,此代码执行。
我在Form Closing事件中写这样:
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if(e.CloseReason == CloseReason.WindowsShutDown)
{
Properties.Settings.Default.lastShutdown = DateTime.Now;
Properties.Settings.Default.Save();
}
}
通常代码正常工作并且它在设置中保存了DateTime,但我认为有时应用程序会在保存完成之前关闭并丢失数据。我不知道应用程序在关闭之前有多少时间关闭。
¿有什么方法可以确保代码在关机前总是完成吗?
感谢。
答案 0 :(得分:2)
您可以将处理程序附加到SystemEvents.SessionEnded事件并在那里运行您的代码。您甚至可以使用Cancel属性取消关闭/注销事件。
可以在FormClosing
事件上运行相同的代码,但使用CloseReason == CloseReason.UserClosing || CloseReason == CloseReason.ApplicationExitCall || CloseReason == CloseReason.TaskManagerClosing
覆盖所有方案。
答案 1 :(得分:2)
我认为如果你定期保存变量会更好,而不是保存'喊叫时间'。这样一来,如果出现问题,你最多会失去1个间隔。
答案 2 :(得分:1)
您可以定期保存每次会话的最后一次活动。例如在表单上创建一个计时器。这样,即使你立刻失去了力量,你也知道你最后一次活着。
private void Form1_Load(object sender, EventArgs e)
{
/* Set the last shutdown to the last time we were alive.. */
Properties.Settings.Default.LastShutdown = Properties.Settings.Default.LastHeartbeat;
this.timer1.Interval = 100;
this.timer1.Tick += timer1_Tick;
this.timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
Properties.Settings.Default.LastHeartbeat = DateTime.UtcNow;
Properties.Settings.Default.Save();
}
答案 3 :(得分:0)
只需在计算机关闭并再次启动时使用计时器保存整个时间,您可以调用配置中的最后一个条目。
`Timer time = new Timer(1);
time.Elapsed += timer_elapsed();
private static void timer_elapsed(Object source, System.Timers.ElapsedEventArgs e) { YOUR CODE HERE}`