c#wpf日期时间更改(新的一天已经到来)事件

c#wpf日期时间更改(新的一天已经到来)事件,c#,wpf,C#,Wpf,大家好,我试着做一些类似的事情来创建事件,当新的日期到来时开始做一些事情,比如2014/01/01和2014/01/02,然后做一些事情: private void Datetime.now_changed(days)(object sender, RoutedEventArgs e) { do some stuff; } 我该怎么办?您可以创建一个类来检查日期变化: using System; using System.Timers; public

大家好,我试着做一些类似的事情来创建事件,当新的日期到来时开始做一些事情,比如2014/01/01和2014/01/02,然后做一些事情:

private void Datetime.now_changed(days)(object sender, RoutedEventArgs e)
    {
           do some stuff;
    }

我该怎么办?

您可以创建一个类来检查日期变化:

using System;
using System.Timers;


public class Clock
{
    private readonly Timer _timer = new Timer(1000);
    private DateTime _yesturday = DateTime.Today;

    public event EventHandler NewDay;

    public Clock()
    {
        _timer.Elapsed += Timer_Elapsed;
        _timer.Start();
    }

    void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (_yesturday != DateTime.Today)
        {
            if (NewDay != null) NewDay(this, EventArgs.Empty);
            _yesturday = DateTime.Today;
        }
    }


}
现在我们可以使用:

 private void button1_Click(object sender, EventArgs e)
    {
        var c = new Clock();
        c.NewDay += OnNewDay;
    }

 private void OnNewDay(object sender, EventArgs e)
    {
        // new day comes
    }

创建一个计划的任务可能是你最好的行动方式。如果不是的话,你可以(理论上)将类设置为00:00之前的任何时间。通常,它在较短的时间跨度上是有意义的,比如“每10秒”,而不是“每24小时”


现在,问题是,您要么有一个长时间(持续)运行的应用程序,要么只有一些代码每24小时执行一次。在第二种情况下,您最好使用调度程序。对于长时间运行的应用程序,我假设它除了每天24小时等待之外,实际上还做了一些事情,然后您可以使用计时器,或者使用某种方式利用调度程序(比如通过WCF-google:.net中的进程间通信,或者仅仅通过filesystem watcher?

您的问题完全不清楚。您想做什么?为什么不在Windows中添加一个每天运行一次的计划任务呢?这是一个很好的解决方案,但存在一个bug。您需要在发布事件之前停止计时器,并在重新分配新的日期之后再次启动计时器。原因是,如果事件接收器调用运行时间超过1秒的函数,它将得到一个双事件。停止和启动将消除这种可能性。另外,既然这是一个WPF线程,为什么不使用Dispatcher来代替呢?普通计时器在与UI不同的线程上发送事件。如果改用Dispatcher,则偶数位于UI线程上,因此事件接收器可以更新UI组件,而无需先进行调用。只是一个建议。