Как установить таймер на определенное время в C#

У меня есть требование, где мне нужно выполнить таймер на 00:01:00 утра каждый день...Но я не понимаю, как этого достичь ..Если я беру системное время, оно может быть в другом формате.. Вот мой код таймера..

static System.Timers.Timer timer;
timer = new System.Timers.Timer();
timer.Interval = 1000 * 60 * 60 * 24;//set interval of one day
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
start_timer(); 

static void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        // Add timer code here

    }
    private static void start_timer()
    {
        timer.Start();
    }

3 ответов


что вы должны сделать, это написать программу, которая делает все, что вам нужно, а затем использовать встроенный планировщик задач вашей ОС, чтобы запустить его. Это было бы самым надежным. Например, планировщик задач Windows может запускать приложение до входа пользователя в систему, при необходимости перезапускать приложение, регистрировать ошибки и отправлять уведомления и т. д.

В противном случае вам придется запускать приложение 24/7 и регулярно опрашивать его на время.

например, вы можно менять интервал каждую минуту:

timer.Interval = 1000 * 60;

и внутри Elapsed событие, проверьте текущее время:

static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    if (DateTime.Now.Hour == 1 && DateTime.Now.Minute == 0)
    {
        // do whatever
    }
}

но это очень ненадежно. Ваше приложение может аварийно завершить работу. И работа с DateTime может быть сложной.


Если вы хотите запустить таймер ровно в 00: 01: 00, Сделайте некоторое время обработки, а затем перезапустите таймер, вам просто нужно рассчитать разницу между Now и следующий 00:01: 00am временной интервал, например.

static Timer timer;
static void Main(string[] args)
{
    setup_Timer();
}

static void setup_Timer()
{
    DateTime nowTime = DateTime.Now;
    DateTime oneAmTime = new DateTime(nowTime.Year, nowTime.Month, nowTime.Day, 0, 1, 0, 0);
    if (nowTime > oneAmTime)
        oneAmTime = oneAmTime.AddDays(1);

    double tickTime = (oneAmTime - nowTime).TotalMilliseconds;
    timer = new Timer(tickTime);
    timer.Elapsed += timer_Elapsed;
    timer.Start();
}

static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    timer.Stop();
    //process code..
    setup_Timer();
}

вы всегда можете вычислить его:

static void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    // Do stuff

    start_timer();
}

private static void start_timer()
{
    timer.Interval = CalculateInterval();
    timer.Start();
}

private static double CalculateInterval()
{
    // 1 AM the next day
    return (DateTime.Now.AddDays(1).Date.AddHours(1) - DateTime.Now).TotalMilliseconds;
}