#wpf #multithreading #user-interface #blocking #repaint
#wpf #многопоточность #пользовательский интерфейс #блокировка #перерисовать
Вопрос:
У меня есть какая-то задача, которая замораживает пользовательский интерфейс на несколько секунд, и в данном конкретном случае у меня нет другого выбора, кроме как выполнить ее из потока пользовательского интерфейса (обычно я использую диспетчеры).
Я полностью понимаю, что мое окно не может перерисовать себя в течение этого времени, но как мне заставить указатель мыши перерисовать себя перед выполнением блокирующего вызова? Прямо сейчас я делаю:
Me.Cursor = System.Windows.Input.Cursors.Wait
[Heavy Task]
Me.Cursor = System.Windows.Input.Cursors.Default
Но окно не обновляет курсор до курсора ожидания, потому что поток пользовательского интерфейса заморожен? Как мне принудительно выполнить обновление?
Комментарии:
1. Пересмотрите выполнение задачи в потоке пользовательского интерфейса
2. @FactorMystic Ты прочитал что-нибудь, что я написал?
3. конечно, я это сделал, но я предлагаю повернуть, чтобы решить, почему вы не можете выполнять длительную работу вне потока пользовательского интерфейса
4. Это не длительная работа (максимум 2 секунды), но она вызывает компонент базы данных, который не является потокобезопасным, и переписать этот компонент будет намного сложнее, чем просто принудительно навести правый курсор.
Ответ №1:
Кажется, я нашел решение. Вместо изменения курсора для окна, переопределите его глобально:
Mouse.OverrideCursor = Cursors.Wait;
[Heavy Task]
Mouse.OverrideCursor = Cursors.Default;