2008-12-16 74 views
9

有没有办法让c#中的日期更改通知?有没有办法让c#中的日期更改通知?

我有一个要求,当系统日期改变时我必须做些什么。

我发现SystemsEvent.TimeChanged是一个您可以挂钩的事件,但只有在用户更改时间时才会触发它。

+0

你应该描述你正在努力完成什么,或者你的意思是系统日期变化。所有的答案都在猜测你真正的问题是什么。 – 2008-12-16 20:06:46

回答

6

通过在午夜运行计划任务/ cron作业可以更好地处理此问题吗?

2

您可以实现这个(当然很差)如下:

写一个非常轻量级的类简单地存储当前日期。在一个单独的线程中启动它,并定期检查日期,然后睡眠大量时间(实际上,您可以让它的睡眠时间比直到午夜的时间长)。如果日期发生变化,请在应用的主要部分调用回调函数。

就像我说的,这看起来不像是你的问题的一个明智的解决方案,并有可能有更好的方法来做到这一点。

+0

真的没有理由浪费这个线程。就像Darryl Braaten所建议的那样加上回调。回调由一个线程池线程执行,所以你不需要有一个线程挂在这里。 – 2008-12-16 19:57:25

0

你的应用程序可以运行一个睡眠一分钟的循环,然后检查日期。如果与上次不同,请运行您的逻辑。

但我同意这种情况会更好地处理一个计划的任务。

0

不知道是否有这样的事件,但如果没有,可用的解决方法是每分钟启动一个计时器,并且如果时间在两次呼叫之间改变超过5分钟,那么您可以确信时间已经以某种方式改变了。如果你喜欢,可以每隔一秒发射一次事件,并检查超过10秒的时间差,但每分钟都可能足够。

1

假设你所要求的是当用户改变他们PC的日期\时间就知道了,我知道做到这一点的唯一方法是监控事件日志,是这样的:

static System.Diagnostics.EventLog log = new EventLog("System"); 

    public Form1() 
    { 
     log.EntryWritten += new EntryWrittenEventHandler(log_EntryWritten); 
     log.EnableRaisingEvents = true; 
    } 

    void log_EntryWritten(object sender, EntryWrittenEventArgs e) 
    { 
     if (e.Entry.InstanceId == 1 && e.Entry.EntryType == EventLogEntryType.Information) 
      Console.WriteLine("Test"); 
    } 
0

或者用这个DST信息: TimeZone.CurrentTimeZone.GetDaylightChanges(DateTime.Today.Year)

2

系统广播WM_TIMECHANGE message当用户改变系统日期/时间。处理这个问题的正确方法是处理该消息。我怀疑.net事件SystemEvents.TimeChanged只是一个包装。

相关问题