Как установить таймер на определенное время в 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;
}