Требование для моего приложения: если оно теряет соединение с базой данных, то должно появиться большое модальное диалоговое окно «Нет соединения. Попробуйте позже», блокирующее все взаимодействия с пользователем до тех пор, пока соединение не будет восстановлено.
Я достигаю этого путем запуска приложения, запускающего экземпляр класса DeviceMonitor. Этот класс создает System.Threading.Timer и каждый тик (обычно 1 секунду), а также несколько других вещей, которые он пытается извлечь из базы данных. Если отрисовка не удалась и причина была определена из-за отсутствия соединения, исключение обрабатывается путем всплывающего окна вышеупомянутого диалога. Аналогичным образом, если выборка данных завершается успешно и диалоговое окно в данный момент работает, то оно принудительно закрывается.
Проблема в том, что, хотя все это работает нормально, диалоговое окно ConnectionLost не блокирует взаимодействие пользователя с пользовательским интерфейсом. Это имеет смысл, поскольку событие Timer.Elapsed вызывается в его собственном потоке, а noConnectionDialog.ShowDialog () вызывается из функции обратного вызова, блокируя поток, в котором он находится, но не поток пользовательского интерфейса.
Насколько я понимаю, мне нужно либо принудительно запустить noConnectionDialog.ShowDialog () в потоке пользовательского интерфейса, либо заблокировать поток пользовательского интерфейса до вызова noConnectionDialog.Hide (), но я не знаю, как это сделать.
Возможно, есть какое-то другое лекарство или я что-то здесь упускаю. Любой совет приветствуется.
РЕДАКТИРОВАТЬ: Дополнительная информация - это стилизованный диалог, а не просто окно сообщения. Он создается, когда мое приложение запускается Castle Windsor и внедряется в класс DialogFactory, который передается. Таким образом, к диалогу обращается
var d = _dialogFactory.GetNoConnectionDialog();
d.ShowDialog();
Я экспериментировал с размещением этого кода за пределами обратного вызова таймера - например, когда нажимается кнопка на интерфейсе пользовательского интерфейса - и он прекрасно блокирует пользовательский интерфейс, поэтому вопрос не в том, где создается форма.