Запуск диспетчерского таймера с N секунд, минут, часов

#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 в этом случае вам, вероятно, следует изменить имя переменной 😉