Альтернатива секундомеру для десериализации - PullRequest
0 голосов
/ 05 ноября 2019

Я работаю с функцией, которая измеряет время входа пользователя в систему. Требуется, когда программа неожиданно закрывается (сбой питания, сбой, уничтожение диспетчером задач ... почти все, кроме обычного выхода из системы), таймер / секундомер должен продолжать работать плюс старое значение.

Пример: программа использования пользователем 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);
}


Мой вопрос:

Мое решение плохо или подвержено ошибкам? (Я не могу сказать)

Есть ли какое-либо существующее решение для этой проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...