WPF: обновление указателя мыши, когда поток пользовательского интерфейса заблокирован

#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;