Обновить переменную DateTime в C#

#c# #.net #datetime #timespan

#c# #.net #datetime #промежуток времени

Вопрос:

В моем приложении на C # я объявил private DateTime _time = DateTime.UtcNow; . Я обновил это в одном из своих методов следующим образом:

 public void MessageReceived(int value)
{
    if (value == 2)
    {
        _time = DateTime.UtcNow;
    }
}
 

Это вызвало проблему при запуске моего приложения. после некоторого исследования я обнаружил, что DateTime является неизменяемым, поэтому мой метод создал новый экземпляр переменной, а не обновил его до текущего DateTime. Как я могу обновить ее таким образом? Я вижу, что могу добавить временной интервал к существующему методу, но я не знаю, как это можно сделать так, как я хочу его использовать.

Дополнительная информация

Вот мой полный класс (ведение журнала добавлено для демонстрации):

 public class Health : IHealth
{
    private readonly IConfig _config;
    private readonly ILogger<Health> _logger;

    private DateTime _time = DateTime.UtcNow;
    private readonly TimeSpan _timespan;

    public bool IsHealthy
    {
        get
        {
            _logger.LogInformation("IsHealthy DateTime.UtcNow: "   DateTime.UtcNow   " _time: "   _time   " _time.Add(_timespan):"   _time.Add(_timespan));
            return (_time.Add(_timespan) > DateTime.UtcNow);
        }
    }

    public Health([NotNull] IConfig healthOptions, ILogger<Health> logger)
    {
        _config = healthOptions ?? throw new ArgumentNullException(nameof(healthOptions));
        _timespan = _config.HealthTimespan;
        _logger = logger;
    }

    public void MessageReceived(int value)
    {
        if (value == 2)
        {
            _logger.LogInformation("OnMessage DateTime.UtcNow: "   DateTime.UtcNow   " _time before: "   _time);
            _time = DateTime.UtcNow;
        }
    }
}
 

MessageReceived вызывается каждый раз при получении сообщения и IsHealthy вызывается пользовательской операцией. _time обновляется в MessageReceived методе, но остается с инициализированным значением в то IsHealthy время как мне нужно, чтобы оно соответствовало любому текущему значению, в котором оно установлено MessageReceived .

Вот фрагмент выходных данных журнала из недавнего запуска:

2020-12-09 07:48:46.155Z INFO APP= 2227 COMP = 3790 [15] onMessage DateTime.UtcNow: 09/12/2020 07:48:46 _time до: 09/12/2020 07:48:46 — Logger=Cdi.Mdp.FeedHandler.Проверка работоспособности.HealthHandler,Level=INFO,ThreadId=15, 2020-12-09 07:48:46.181Z INFO APP= 2227 COMP = 3790 [17] Является исправным DateTime.UtcNow: 09/12/2020 07:48:46 _time: 09/12/2020 07:47:52 _time.Добавить(_timespan):09/12/2020 07:48:22 — Logger=Cdi.Mdp.FeedHandler.Проверка работоспособности.Обработчик работоспособности, уровень = ИНФОРМАЦИЯ, идентификатор потока =17,

09/12/2020 07:47:52 это то, что _time было инициализировано. Последнее сообщение, полученное в 09/12/2020 07:48:46 и OnMessage , было выполнено и _time установлено в 09/12/2020 07:48:46 . IsHealthy также выполнялось в это время, но вторая строка журнала показывает _time , что имеет исходное значение.

Комментарии:

1. Вам нужно постоянно обновляющееся datetime (например, часы?) Или вам нужна временная метка текущего datetime? Могу я также спросить, что value == 2 означает?

2. Да, DateTime является неизменяемым, но вы объявили _time его как поле, доступное для записи, поэтому его следует перезаписать при назначении ему. В чем проблема?

3. Предоставленный код работает нормально. Если вы считаете, что она неизменна, я уверен, что ошибка заключается в том, как вы используете _time, и я предполагаю, что вы буферизуете ее или не обновляете визуализацию или что-то в этом роде. Попробуйте воспроизвести ее в новой программе, и вы увидите, что ошибки нет в предоставленном коде.

4. «Вот фрагмент» — объясните, что мы здесь видим и что вы ожидаете увидеть.

5. Я подозреваю, что вам нужно будет создать «пользовательский» класс поставщика времени, который будет зарегистрирован как одноэлементный в DI. Похоже, это часть некоторых ASP.NET стек или что-то в этом роде, так что значение даты и времени будет «для каждого вызова». Абсолютно уродливое, но, вероятно, рабочее решение — сделать поле _time статическим. Я бы порекомендовал поставщика времени, он обычно помогает при тестировании (время насмешки :))