#c# #timer
Вопрос:
Я использовал Систему.Нарезание резьбы.Таймер в моем проекте, как код ниже:
async Task Timer()
{
timer = new System.Threading.Timer((_) =>
{
TimeSpan span = DateTime.Now.Subtract(ed);
Time = (TimeSpan.FromTicks(span.Ticks).ToString()).Substring(0, 8);
InvokeAsync(() =>
{
StateHasChanged();
});
}, null, 0, 1000);
}
он вычитает два разных времени и покажет таймер. Все работает нормально, пока не пройдет еще 24 часа.
Вот мой вопрос. Как я должен изменить свой код, чтобы показывать таймер даже через 24 часа?
Заранее спасибо
Комментарии:
1. 1000 миллисекунд = 1 секунда. 1 день = 24 часа * 60 минут * 60 секунд * 1000 миллисекунд = 86400000 миллисекунд. Документы для конструктора, который вы используете .
2.
Every thing works fine until it is not still 24H.
И что происходит потом? Как конкретно это не работает?3. Расскажите нам, чего
.Substring(0, 8);
вы пытаетесь достичь.4. Я не вижу смысла в том, чтобы ваш метод был
async Task Timer()
. Это не делает никаких ожиданий.5. Кстати, я бы использовал Rx. Тогда вы могли бы сделать это
Observable.Interval(TimeSpan.FromDays(1.2)).Subscribe(x => { /* Do stuff */ });
.
Ответ №1:
Временные промежутки увеличиваются до уровня дней, они не останавливаются на подсчете часов. Если у вас есть промежуток времени, равный 23:59:59, и вы добавляете к нему секунду, вы не получаете 24:00:00, вы получаете 1 день 00:00:00
Если вы хотите, чтобы это считалось часами вечно, вам придется самому умножить дни на часы
$"{t.Days*24 t.Hours}:{t.Minutes}:{t.Seconds}"
Вы также можете сократить десятичную часть от общего количества часов
$"{(int)t.TotalHours}:{t.Minutes}:{t.Seconds}"
$"{t.TotalHours:F0}:{t.Minutes}:{t.Seconds}"