确保在关机之前执行C#代码

时间:2017-07-12 06:26:09

标签: c# .net winforms

我正在开发一个需要节省计算机关机时间的应用程序,我需要确保总是计算机关机/重启,此代码执行。

我在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,但我认为有时应用程序会在保存完成之前关闭并丢失数据。我不知道应用程序在关闭之前有多少时间关闭。

¿有什么方法可以确保代码在关机前总是完成吗?

感谢。

4 个答案:

答案 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}`