C#时间驱动事件

本文关键字:事件 时间 | 更新日期: 2023-09-27 18:19:34

我正在努力完成我的大学作业,该作业要求创建一个时间驱动的事件。报告应每天两次自动通过电子邮件发送给负责人。我需要从数据库中获取时间,这很容易做到。现在,我已经创建了一个这样的计时器:

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()。我不确定我应该做什么改变。因此,基本上,计时器需要在一天中运行两个不同的时间。当报告同时发送时,它应该默认为第二天的最早时间(如果有意义的话)。

谢谢你的建议。

C#时间驱动事件

Timer的属性为AutoReset,将其设置为false可禁用它在Elapsed事件后自动重新启动。

例如:

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

当您再次调用getDate()时,它正在创建Timer的第二个(新)实例。你的第一个计时器还在滴答作响。要解决此问题,需要将Timer实例化从getDate()方法中移出。将其移动到构造函数

//Move this to the constructor  
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);