Система.Дата-время и кэширование TimeZoneInfo и CultureInfo

#.net #windows #winforms #winapi #datetime

#.net #Windows #winforms #winapi #datetime

Вопрос:

У меня есть два отдельных.СЕТЕВЫЕ приложения, один сервер и другая WinForms. В приложении WinForms запущены часы, показывающие текущее время из DateTime.Now. Серверное приложение может изменять часовой пояс окна. Мне нужно уведомить приложение WinForms о том, что часовой пояс изменился, чтобы элемент управления часами мог очистить свой кэш и показать правильное время. Я могу отправить ему сообщение, но я ищу стандартный способ, как это делается в Windows. Каков наилучший подход? Регистрирует ли сообщение в обоих и отслеживает ли его в WndProc оно?

Комментарии:

1. Я предполагаю, что вы не вызываете DateTime. Теперь неоднократно? Если нет, то почему нет? Если вы это сделаете, не будет ли это автоматически возвращать новое местное время после изменения часового пояса?

Ответ №1:

Хорошо, итак, я собираюсь ответить на свой собственный вопрос, поскольку речь шла конкретно о системных событиях, а предыдущий ответ дал хорошее, но общее решение. В принципе, я выяснил, что существует Microsoft.Win32.SystemEvents класс, у которого есть TimeChanged событие. Все, что вам нужно сделать в вашем приложении, это сделать что-то вроде следующего:

 SystemEvents.TimeChanged  = (s, e) =>
        {
            CultureInfo.CurrentCulture.ClearCachedData();
            TimeZoneInfo.ClearCachedData();
        };
  

Это приведет к аннулированию кэша DateTime, и при следующем опросе времени в вашем DateTime будет указано правильное время.Теперь структура.

Ответ №2:

Поскольку они оба .В сетевых приложениях я рекомендую использовать коммуникационную технологию, такую как Windows Communication Foundation, для обеспечения связи между приложениями.

На вашем сервере было бы настроено, ServiceHost чтобы ваши приложения WinForms имели прокси-сервер для настроенной вами службы.

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

Комментарии:

1. да, я не был полон в своем вопросе. дело в том, что у меня есть 5 серверных приложений :), которые обмениваются данными друг с другом с помощью WCF, и когда одно из них меняет часовой пояс, остальные получают уведомление. Тем не менее, я искал «стандартное» решение, как это делается в целом в отношении приложений пользовательского интерфейса. это часть пользовательской оболочки, поэтому некоторые вещи работают не так, как я ожидал…

2. @Alex: Нет причин, по которым вы не можете обеспечить обмен данными, который происходит между серверами, между сервером и клиентами, в зависимости от транспортного механизма, конечно.