4

最近我正在尝试制作一个日历应用程序,它将向用户显示当前的年月日。问题是,如果用户要让我的应用程序在第二天继续运行,我如何得到通知?如何更改显示的日期?我不想轮询当前日期来更新它。这在 c# 中是否可能。

注意:我尝试了SystemEvent.TimeChanged事件,但只有当用户从控制面板手动更改时间/日期时它才有效。

4

5 回答 5

6

@OddThinking 的答案将起作用(您可以为间隔设置一个计时器而不是睡眠)。另一种方法是设置一个间隔为 1 分钟的计时器,然后简单地检查系统日期是否已更改。由于您每分钟只执行一次轻量级代码,我怀疑开销会很明显。

于 2008-11-17T10:22:29.613 回答
6
public void Main()
{

    var T = new System.Timers.Timer();

    T.Elapsed += CallBackFunction;

    var D = (DateTime.Today.AddDays(1).Date - DateTime.Now);

    T.Interval = D.TotalMilliseconds;

    T.Start();

}

private void CallBackFunction(object sender, System.Timers.ElapsedEventArgs e)
{

    (sender as System.Timers.Timer).Interval = (DateTime.Today.AddDays(1).Date - DateTime.Now).TotalMilliseconds;

}
于 2010-11-04T14:11:59.693 回答
4

你能简单地计算出直到午夜的秒数,然后睡那么久吗?

于 2008-11-17T10:15:53.260 回答
1

尝试查看监视 WMI 事件,您应该能够创建一个 Wql 事件查询来监视星期几的变化(即 ManagementEventWatcher 等),然后设置一个在事件到达时触发的事件处理程序。

使用系统;
使用 System.Management;

课堂节目
{
    公共静态无效 Main()
    {
        WqlEventQuery q = 新 WqlEventQuery();
        q.EventClassName = "__InstanceModificationEvent";
        q.Condition = @"TargetInstance ISA 'Win32_LocalTime' AND TargetInstance.Hour = 22 AND TargetInstance.Minute = 7 AND TargetInstance.Second = 59";

        Console.WriteLine(q.QueryString);

        使用 (ManagementEventWatcher w = new ManagementEventWatcher(q))
        {
            w.EventArrived += new EventArrivedEventHandler(TimeEventArrived);
            w.Start();
            Console.ReadLine(); // 阻塞这个线程仅用于测试目的....
            w.停止();
        }
    }

    静态无效 TimeEventArrived(对象发送者,EventArrivedEventArgs e)
    {
        Console.WriteLine("这是你的警钟");
        Console.WriteLine("{0}", new
        DateTime((long)(ulong)e.NewEvent.Properties["TIME_CREATED"].Value));
    }
}
于 2008-11-17T10:18:14.630 回答
0

一个检查日期变化的线程怎么样。线程可以有一些需要此信息的控件可以订阅的事件。

于 2008-11-17T11:00:37.010 回答