【问题标题】:C# time driven eventC# 时间驱动事件
【发布时间】:2023-03-22 01:49:01
【问题描述】:

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

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

感谢您的任何建议。

【问题讨论】:

  • However, the timer doesn't seem to stop. 也许你应该在它被触发后关闭它? aTimer.Enabled = false.
  • 在 OnTimedEvent 中放置一个计数器,当它的 2 停止计时器。
  • 很遗憾,他们教你将Timer 用于定时事件,而像 Windows Scheduler 这样的调度程序更适合现实世界。

标签: c# timer


【解决方案1】:

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

例如:

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

【讨论】:

  • 这成功了!非常感谢。一旦报告已经发送了两次,那么将计时器设置为第二天正确时间的最佳方法是什么? IE,如果我的报告预定在上午 9 点和晚上 8 点发送,我应该如何告诉系统在晚上 8 点发送报告后将计时器更新到第二天? DateTime 警报 = new DateTime(2015, 10, 27, 19, 39, 0);
  • 我不明白你,对那行做什么?如果您问的是什么,我已经在答案中添加了一些示例代码。
  • 抱歉,请参阅我编辑的评论。按 Enter 太快了。
  • 啊,好吧,这有点棘手。您必须使用Timer 类还是可以使用其他东西?
  • 那么作业特别说明了“创建计时器驱动事件”,所以我认为我必须使用计时器类
【解决方案2】:

当您再次调用getDate() 时,它会创建第二个(新的)Timer 实例。您的第一个计时器仍在计时。要解决此问题,您需要将 Timer 实例化移出 getDate() 方法。将其移至构造函数

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

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2013-01-10
    • 2015-10-09
    相关资源
    最近更新 更多