28

如何在特定时间生成事件?例如,假设我想在上午 8:00 生成一个警报,通知我其上午 8:00(或在任何给定时间通知我当前时间的事件)。

4

4 回答 4

47

使用System.Threading.Timer类:

var dt = ... // next 8:00 AM from now
var timer = new Timer(callback, null, dt - DateTime.Now, TimeSpan.FromHours(24));

callback下次上午 8:00 和之后每 24 小时将呼叫代表。

请参阅此 SO 问题如何计算下一个上午 8:00 发生。

于 2009-08-18T23:29:28.037 回答
9

详细说明 dtb 的答案,这就是我实现它的方式。

  private void Form1_Load(object sender, EventArgs e)
    {
        System.Threading.TimerCallback callback = new TimerCallback(ProcessTimerEvent);

        //first occurrence at
        var dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 10, 0, 0);

        if (DateTime.Now < dt)
        {
            var timer = new System.Threading.Timer(callback, null, 
                                               //other occurrences every 24 hours
                            dt - DateTime.Now, TimeSpan.FromHours(24));
        }

    }

    private void ProcessTimerEvent(object obj)
    {
        MessageBox.Show("Hi Its Time");
    }
于 2011-12-27T04:32:01.440 回答
1

警报是否必须由您的程序生成?另一种方法是使用计划任务(在 Windows 中)生成警报。您可能需要编写一个小程序,从主应用程序的数据文件等中收集任何信息。

使用这种方法有几个主要好处:

  1. 您不必编写任何代码来支持该功能。你利用了操作系统内置的东西。该示例适用于 Windows,但其他操作系统具有相同的功能。您可以将开发和支持工作集中在您自己的代码上。
  2. 您的主应用程序不必运行即可触发任务。
于 2009-12-10T22:56:50.763 回答
0
private void Run_Timer()
    {
        DateTime tday = new DateTime();
        tday = DateTime.Today;
        TimeSpan Start_Time = new TimeSpan(8,15,0);
        DateTime Starter = tday + Start_Time;
        Start_Time = new TimeSpan(20, 15, 0);
        DateTime Ender = tday + Start_Time;
        for (int i = 0; i <= 23; i++)
        {
            Start_Time = new TimeSpan(i, 15, 0);
            tday += Start_Time;
            if (((tday - DateTime.Now).TotalMilliseconds > 0) && (tday >= Starter) && (tday <= Ender))
            {
                Time_To_Look = tday;
                timer1.Interval = Convert.ToInt32((tday - DateTime.Now).TotalMilliseconds);
                timer1.Start();
                MessageBox.Show(Time_To_Look.ToString());
                break;
            }
        }
    }

我们可以使用此功能让计时器运行多次或将其更改为在特定时间运行:D

于 2009-08-20T23:53:28.540 回答