Есть ли способ получить уведомление об изменении даты в c #? - PullRequest
9 голосов
/ 16 декабря 2008

Есть ли способ получить уведомление об изменении даты в c #?

У меня есть требование, когда я должен что-то делать при изменении системной даты.

Я обнаружил, что SystemsEvent.TimeChanged - это событие, к которому можно подключиться, однако оно вызывается только тогда, когда пользователь изменил время.

Ответы [ 8 ]

6 голосов
/ 16 декабря 2008

Будет ли это лучше обрабатывать, если запланированное задание / задание хрон выполняется в полночь?

2 голосов
/ 06 марта 2009

Система передает WM_TIMECHANGE сообщение , когда пользователь изменяет системную дату / время. Правильный способ справиться с этим - обработать это сообщение. Я подозреваю, что событие .net SystemEvents.TimeChanged является всего лишь оберткой вокруг этого.

2 голосов
/ 16 декабря 2008

Возможно, вы ищете System.Threading.Timer . Он будет срабатывать с интервалом, который вы установили.

2 голосов
/ 16 декабря 2008

Вы можете реализовать это (правда, плохо) следующим образом:

Напишите очень легкий класс, который просто хранит текущую дату. Запустите его в отдельном потоке и заставьте его периодически проверять дату, затем спите в течение большого количества времени (фактически, вы можете заставить его спать дольше, чем до полуночи). Если дата изменилась, сделайте так, чтобы она вызывала функцию обратного вызова в основной части вашего приложения.

Как я уже сказал, это не похоже на блестящее решение вашей проблемы, и, вероятно, есть гораздо лучшие способы сделать это.

1 голос
/ 18 декабря 2008

Если предположить, что вы запрашиваете, это знать, когда пользователь меняет дату \ время своего ПК, единственный способ, которым я знаю, - это отслеживать EventLog, что-то вроде этого:

    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 голосов
/ 06 марта 2009

Или используйте это для информации о летнем времени: TimeZone.CurrentTimeZone.GetDaylightChanges (DateTime.Today.Year)

0 голосов
/ 16 декабря 2008

Не уверен, что для этого есть какое-то событие, но если нет, то применимым обходным решением будет срабатывание таймера каждую минуту, а если время между вызовами меняется более чем на 5 минут, то вы можете быть уверены, что был изменен так или иначе. Если хотите, вы можете сделать более мелкозернистым, запуская событие каждую секунду и проверяя разницу во времени более чем на 10 секунд, но, вероятно, будет достаточно каждой минуты.

0 голосов
/ 16 декабря 2008

Ваше приложение может запустить цикл, который спит минуту, а затем проверяет дату. Если это не так, как в прошлый раз, запустите свою логику.

Но я согласен, что этот сценарий будет лучше обрабатываться с запланированным заданием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...