2015-10-27 2 views
0

Я пытаюсь завершить свое назначение в колледже, которое просит создать событие, управляемое временем. Отчет должен автоматически отправляться по электронной почте ответственному лицу два раза в день. Мне нужно получить время из базы данных, что я могу сделать довольно легко. В настоящее время, я создал таймер, как это:Событие, связанное с C#

private static void getDate() 
    { 
     DateTime now = DateTime.Now; 
     DateTime alarm = new DateTime(2015, 10, 27, 19, 23, 0); 

     TimeSpan diff = alarm - now; 

     System.Timers.Timer aTimer = new System.Timers.Timer(); 
     aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
     // Set the Interval to the difference in time from now to your alarm. 
     if (diff.TotalMilliseconds > 0) 
     { 
      aTimer.Interval = diff.TotalMilliseconds; 
      aTimer.Enabled = true; 
     } 
     else 
     { 
      aTimer.Enabled = false; 
      aTimer.AutoReset = true; 
      aTimer.Dispose(); 
     } 
    } 

Когда форма инициализирована, функция GetDate() выполняется для запуска таймера. Когда таймер попадает в определенное время, я запускаю этот код:

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     Console.WriteLine("Hello World!"); 
     XslCompiledTransform transformer = new XslCompiledTransform(); 
     transformer.Load("report.xsl"); 
     transformer.Transform("Report.xml", "Report.html"); 

     string html = File.ReadAllText("Report.html"); 
     SendMail(html); 
    } 

После того, как электронная почта направляется лицу, я запустить функцию GetDate() для обновления времени. Однако таймер не останавливается. По умолчанию используется интервал 100.00 и выполняется выполнение OnTimedEvent(). Я не уверен, какие изменения я должен внести. Таким образом, в основном таймер должен работать два раза в день. Когда отчет отправляется оба раза, он должен быть установлен по умолчанию до самого раннего времени на следующий день (если это имеет смысл).

Благодарим за любые предложения.

+0

'Тем не менее, таймер, похоже, не останавливается. Возможно, вам следует отключить его, как только он будет запущен? 'aTimer.Enabled = false'. –

+0

поместите счетчик в OnTimedEvent и когда его 2 остановите таймер. –

+0

Печально, что они учат вас использовать таймер для тайм-события, когда планировщик, такой как Windows Scheduler, будет более уместен в реальном мире. –

ответ

0

Timer имеет свойство AutoReset, установите это значение false, чтобы отключить его после перезапуска после события Elapsed.

.: например

System.Timers.Timer aTimer = new System.Timers.Timer 
{ 
    AutoReset = false 
}; 
+0

Это сделало трюк! Большое спасибо. Каков наилучший способ установить таймер на правильное время на следующий день, как только отчет уже отправлен дважды? IE, если я сообщаю, что планируется отправить в 9 утра и 8 вечера, как мне сообщить системе обновить таймер на следующий день после отправки отчета в 8 вечера? DateTime alarm = new DateTime (2015, 10, 27, 19, 39, 0); – ArtleMaks

+0

Я не понимаю, что с этим делать? Я добавил пример ответа на этот вопрос, если вы спрашиваете. – BanksySan

+0

К сожалению, см. Мой отредактированный комментарий. Слишком поздно нажмите. – ArtleMaks

0

При вызове getDate() снова создает второй (новый) экземпляр Timer. Ваш первый таймер все еще тикает. Чтобы исправить это, вам нужно перенести экземпляр Timer из метода getDate(). Переместите его в конструктор

//Move this to the constructor 
System.Timers.Timer aTimer = new System.Timers.Timer(); 
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
Смежные вопросы