Обновление поля с текущей датой

372
29 марта 2017, 14:29

Привет! У меня при запуске приложения C# в поле устанавливается текущая дата. Планируется, что приложение будет работать бесконечное число дней. Как дату обновлять в полночь без перезапуска приложения?

Answer 1

"в поле" - в смысле, в члене класса? Сделайте его свойством:

public class MyClass
{
  public DateTime CurrentDate
  {
    get { return DateTime.Now.Date; }
  }
}
Answer 2

Используйте System.Timers.Timer и его событие Elapsed. Обработчик этого события выполняется в фоновом потоке и не будет блокировать интерфейс. Interval для таймера выставите секунду. Когда условие смены даты внутри обработчика выполнится, просто обновите поле, где хранится дата.

Если под полем подразумевается textbox, то тогда обновляйте его из фонового потока:

Invoke(new MethodInvoker(() =>
        {
          textBox1.Text = DateTime.Now.Date.ToString();  
        }));
Answer 3

1) Вы не указали что за приложение (консоль,winforms, wpf, и т.д)

Если нужено обновление даты в 24 часа можно использовать что-то типа этого (достаточно подписаться на событие которое и оповестит о наступлении нового дня):

static class MidnightNotifier
{
    private static readonly Timer timer;
    static MidnightNotifier()
    {
        timer = new Timer(GetSleepTime());
        timer.Elapsed += (s, e) =>
        {
            OnDayChanged();
            timer.Interval = GetSleepTime();
        };
        timer.Start();
        SystemEvents.TimeChanged += OnSystemTimeChanged;
    }
    private static double GetSleepTime()
    {
        var midnightTonight = DateTime.Today.AddDays(1);
        var differenceInMilliseconds = (midnightTonight - DateTime.Now).TotalMilliseconds;
        return differenceInMilliseconds;
    }
    private static void OnDayChanged()
    {
        var handler = DayChanged;
        if(handler != null)
            handler(null, null);
    }
    private static void OnSystemTimeChanged(object sender, EventArgs e)
    {
        timer.Interval = GetSleepTime();
    }
    public static event EventHandler<EventArgs> DayChanged;
}

Можно и посекундно обновлять значение (пример из wpf):

public class Ticker : INotifyPropertyChanged
{
    public Ticker()
    {
        Timer timer = new Timer();
        timer.Interval = 1000; // 1 second updates
        timer.Elapsed += timer_Elapsed;
        timer.Start();
    }
    public DateTime Now
    {
        get { return DateTime.Now; }
    }
    public DateTime Today
    {
        get { return DateTime.Today;}
    }
    void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs("Now"));
            PropertyChanged(this, new PropertyChangedEventArgs("Today"));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}
READ ALSO
ASP.NET ошибка связанная со списком

ASP.NET ошибка связанная со списком

Создал на странице сортировку, сделал это таким образом

508
Системный разделитель

Системный разделитель

Проблема с dataGridView, когда по умолчанию в системе стоит разделитель "," матюкается БД что не может привести varchar к numeric меняешь разделитель на "" все...

296
POST-Запрос и его ответ

POST-Запрос и его ответ

Вступление: У РЖД есть такая программа лояльности - РЖД БонусСуть её в том, что за успешные поездки пассажирам полагается некий бонус

277