Привет! У меня при запуске приложения C# в поле устанавливается текущая дата. Планируется, что приложение будет работать бесконечное число дней. Как дату обновлять в полночь без перезапуска приложения?
"в поле" - в смысле, в члене класса? Сделайте его свойством:
public class MyClass
{
public DateTime CurrentDate
{
get { return DateTime.Now.Date; }
}
}
Используйте System.Timers.Timer и его событие Elapsed. Обработчик этого события выполняется в фоновом потоке и не будет блокировать интерфейс. Interval для таймера выставите секунду. Когда условие смены даты внутри обработчика выполнится, просто обновите поле, где хранится дата.
Если под полем подразумевается textbox, то тогда обновляйте его из фонового потока:
Invoke(new MethodInvoker(() =>
{
textBox1.Text = DateTime.Now.Date.ToString();
}));
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;
}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости