首页 > 解决方案 > C# 控制台应用程序在关闭前保存上次运行时

问题描述

我正在.Net Framework 4.6.1、Visual Studio 2013、Windows 10 x64 中开发 C# 控制台应用程序。Properties.Settings.Default.LastRuntime每次应用程序关闭时,我都想在属性设置中保存上次运行时时间戳。当用户通过单击关闭 [X] 按钮、、、、Windows 关闭、注销事件来关闭它时,它应该可以Ctrl+C工作Ctrl+Break。这是我的代码。似乎没有任何工作。LastRuntime属性未更新:

     static void Main(string[] args)
     {
        string lrt = Properties.Settings.Default.LastRuntime;
        Console.Write(lrt);
        Console.ReadLine();
        handler = new ConsoleEventDelegate(ConsoleEventCallback);
        SetConsoleCtrlHandler(handler, true);
    }

    // Handle application termination
    static bool ConsoleEventCallback(int eventType)
    {
        // Termination events: Ctrl+C = 0, Ctrl+Break = 1, Close/Cancel = 2, Logoff = 5, Shutdown = 6
        if (new[] { 0, 1, 2, 5, 6 }.Contains(eventType))
        {
            Properties.Settings.Default.LastRuntime = DateTime.UtcNow.ToString("yyyy'-'MM'-'dd'T'hh':'mm':'ss");
            Properties.Settings.Default.Save();
        }
        return false;
    }
    static ConsoleEventDelegate handler;
    private delegate bool ConsoleEventDelegate(int eventType);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetConsoleCtrlHandler(ConsoleEventDelegate callback, bool add);

标签: c#.net

解决方案


这里发生了很多事情,有很多与此事相关的 SO 帖子,所以我将尝试为您总结:

  1. 应用程序设置范围 - 用户与应用程序

简而言之,应用程序范围的设置不能在运行时更改,而用户范围的设置被设计为在运行时读取/写入。

使用用户范围的设置

  1. 为什么我的应用程序设置没有得到持久化?(假设您已经使用用户设置)

如果您将程序集信息设置为自动生成任何版本号 (1.0.*),那么每次调试应用程序时版本号都会不同,因此每次都会创建一个新文件。

如果是这种情况,您将需要对设置文件执行升级:

Properties.Settings.Default.Upgrade()

  1. C# Settings.Default.Save() 不保存?确保您的代码中描述了更改(如果不重新启动)

Default.Reload调用 Save 方法后需要调用:


推荐阅读