#c# #dispatchertimer
#c# #диспетчерский таймер
Вопрос:
Я искал информацию и не смог ее найти. Мой вопрос в том, как запустить DispatcherTimer с N секунд, минут или часов. Я имею в виду, что в настоящее время он начинается с 00:00:00 (также отображается в currentTime Label), но если я хотел бы запустить его с 00:00:30 (также отображается в currentTime Label), что должно быть по-другому?
Чтобы уточнить это подробнее… Когда я запускаю приложение, я выполняю StartWorkingTimeTodayTimer()
. Затем у меня есть Label ( CurrentTime
), который начинает показывать время выполнения приложения. В настоящее время он начинается с 00:00:00. Я хотел бы отобразить, например, 00:00:30 при запуске, а затем пометить на одну секунду, как сейчас … так 00:00:30 -> 00:00:31 -> 00:00:32 -> 00:00:33 -> 00:00:34->
Я пытался поиграть с:
DateTime x30SecsLater = StartTimeWholeDay.AddSeconds(30);
безуспешно.
Текущий код:
private static DateTime StartTimeWholeDay;
private DispatcherTimer _dailyTimer;
public void StartWorkingTimeTodayTimer()
{
StartTimeWholeDay = DateTime.Now;
DateTime x30SecsLater = StartTimeWholeDay.AddSeconds(30);
_dailyTimer = new DispatcherTimer(DispatcherPriority.Render);
_dailyTimer.Interval = TimeSpan.FromSeconds(1);
_dailyTimer.Tick = (sender, args) =>
{
CurrentTime = (DateTime.Now - StartTimeWholeDay).ToString(@"hh:mm:ss"); // DateTime.Now.ToLongTimeString()
};
_dailyTimer.Start();
}
Редактировать:
Я уже пробовал:
public void StartWorkingTimeTodayTimer()
{
StartTimeWholeDay = DateTime.Now;
DateTime x30SecsLater = StartTimeWholeDay.AddSeconds(30);
_dailyTimer = new DispatcherTimer(DispatcherPriority.Render);
_dailyTimer.Interval = TimeSpan.FromSeconds(1);
_dailyTimer.Tick = (sender, args) =>
{
CurrentTime = (DateTime.Now - x30SecsLater).ToString(@"hh:mm:ss"); // DateTime.Now.ToLongTimeString()
};
_dailyTimer.Start();
}
но он вычисляется в обратном направлении…
Это должно пойти другим путем 00:00:30 -> 00:00:31 -> 00:00:32 -> 00:00:33 -> 00:00:34 ->
Комментарии:
1. как насчет использования
Task.Delay
перед запуском таймера?2. Я думал об этом еще немного, но вопрос не до конца ясен: вы действительно хотите, чтобы таймер запускался с задержкой в 30 секунд, или вы хотите
CurrentTime
иметь смещение в 30 секунд?3. Я не хочу начинать с задержки. Я просто хочу начать отсчет с определенного времени. Не с нуля (00:00:00), как сейчас, а, скажем, с (00:00:30 или 00:03:00 или 03:00:50). Не в смысле, что таймер должен ждать или запускаться в определенное время, просто иметь возможность указать время (число), с которого начинать отсчет. Это должно быть что-то очень простое, но я просто не могу понять, как это сделать.
4. Ну, кажется, вы уже были на полпути… Почему вы не попробовали
CurrentTime = (DateTime.Now - x30SecsLater).<etc>
… это началось бы с «-30 секунд»… дает подсказку.5. Пожалуйста, посмотрите мой отредактированный вопрос
Ответ №1:
После долгих попыток запустить WPF с помощью консоли (в .NET 5)…Я потерпел неудачу, поэтому я дам ответ, используя System.Таймеры. Но вы поняли идею.
using System;
using System.Timers;
namespace TimerExample
{
class Program
{
private static DateTime _startTime;
private static void OnTimedEvent(object source, ElapsedEventArgs eea)
{
Console.WriteLine((eea.SignalTime - _startTime)
.Add(TimeSpan.FromSeconds(29)) // 29, because the first trigger happens 1 sec after start
.ToString(@"hh:mm:ss"));
}
static void Main(string[] args)
{
_startTime = DateTime.Now;
var timer = new Timer
{
Interval = 1000, // msec
AutoReset = true,
};
timer.Elapsed = OnTimedEvent;
timer.Start();
Console.WriteLine("Press any key to stop");
Console.ReadKey();
}
}
}
или
using System;
using System.Timers;
namespace TimerExample
{
class Program
{
private static DateTime _startTime;
private static void OnTimedEvent(object source, ElapsedEventArgs eea)
{
Console.WriteLine((eea.SignalTime - _startTime)
.ToString(@"hh:mm:ss"));
}
static void Main(string[] args)
{
_startTime = DateTime.Now.AddSeconds(-29); // again 29 instead of 30
var timer = new Timer
{
Interval = 1000, // msec
AutoReset = true,
};
timer.Elapsed = OnTimedEvent;
timer.Start();
Console.WriteLine("Press any key to stop");
Console.ReadKey();
}
}
}
Комментарии:
1. Спасибо! Минус сработал
DateTime x30SecsLater = StartTimeWholeDay.AddSeconds(-30);
2. @hatman в этом случае вам, вероятно, следует изменить имя переменной 😉