Я работаю с функцией, которая измеряет время входа пользователя в систему. Требуется, когда программа неожиданно закрывается (сбой питания, сбой, уничтожение диспетчером задач ... почти все, кроме обычного выхода из системы), таймер / секундомер должен продолжать работать плюс старое значение.
Пример: программа использования пользователем 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);
}
Мой вопрос:
Мое решение плохо или подвержено ошибкам? (Я не могу сказать)
Есть ли какое-либо существующее решение для этой проблемы?