#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 статическим. Я бы порекомендовал поставщика времени, он обычно помогает при тестировании (время насмешки :))