我正在使用一种测量用户登录时间的功能。要求当程序意外关闭(失去电源,崩溃,被任务管理器终止...除了正常注销外,几乎所有其他操作),计时器/秒表需要继续运行并加上旧值。
示例:用户使用程序1分钟。电脑出现蓝屏。用户再次登录1分钟并注销。保存的TimeSpan
必须为2分钟。
我解决该问题的方法是:每5分钟,该程序会将Stopwatch
的值作为JSON对象保存到本地计算机的文件中。当用户再次登录时,程序将检查是否有一个json文件,其中包含已经运行的Stopwatch
的值。
我知道,无法对System.Diagnostics.Stopwatch
进行反序列化。我试图编写它的修改版本,以便可以有“设定者”来增加旧值。
public class ModifiedStopwatch
{
private readonly Stopwatch Stopwatch;
private TimeSpan elapsed;
[JsonProperty]
private TimeSpan Elapsed { get => elapsed + Stopwatch.Elapsed; set => elapsed = value; }
public ModifiedStopwatch()
{
Stopwatch = new Stopwatch();
Elapsed = TimeSpan.Zero;
}
public ModifiedStopwatch(TimeSpan timeSpan)
{
Stopwatch = new Stopwatch();
Elapsed = timeSpan;
}
public void SetElapsed(TimeSpan timeSpan) => Elapsed = timeSpan;
public void Start() => Stopwatch.Start();
public void Stop() => Stopwatch.Stop();
public void Restart() => Stopwatch.Restart();
public void Reset() => Stopwatch.Reset();
}
实际上,它看起来像这样
ModifiedStopwatch modifiedStopwatch = new ModifiedStopwatch();
modifiedStopwatch.Start();
// ....
// Every 5 mins
using (StreamWriter file = File.CreateText(path))
{
var outer = JsonConvert.SerializeObject(modifiedStopwatch);
file.WriteLine(outer);
}
// Crash
// ....
// Re login
ModifiedStopwatch keepStopwatch;
if (File.Exists(path))
{
var jsonAsString = File.ReadAllText(path);
keepStopwatch = JsonConvert.DeserializeObject<ModifiedStopwatch>(jsonAsString);
}
我的问题是:
我的解决方案不好还是容易出错? (我不知道)
是否存在解决此问题的解决方案?