Как обновить окно windows form

Обновлено: 05.07.2024

WPF: Как обновить элементы пользовательского интерфейса формы в рабочем потоке (механизм Dispatcher)

Это общая проблема: если мы используем больше в программенитьТехнология покаработаЕсли поток (фоновый поток) должен обновить элементы интерфейса (например, индикатор выполнения и т. Д.), Возникнет проблема безопасности потока, поскольку индикатор выполнения создается основным потоком.

На данный момент, примерно,WPFМеханизм не отличается от Windows Forms. Нам нужно обновить следующим образом в Windows FormsформыЭлементы.

image

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

image

Зная это, давайте посмотрим, как делается WPF?

image

Если вы нажмете первую кнопку, мы также получим ошибку

image

Нажмите вторую кнопку, она работает нормально

image

Посмотрим какая разница в коде

Обратите внимание, что класс Window не имеет метода Invoke, который отличается от Form. Вместо этого нам нужно получить доступ к свойству Window.Dispatcher и затем вызвать метод Invoke. Больше ничего

Хорошо, так что же такое Диспетчер? Буквально это означает так называемый оператор или диспетчер. Что это значит? У каждого потока есть уникальный диспетчер, и работа, которую мы выполняем в коде, на самом деле заключается в том, чтобы выдавать инструкции диспетчеру, а затем он сделает это за нас. Это верно.

Наша форма создается в главном потоке, и элементы управления внутри, естественно, одинаковы. Ранее мы объяснили, что приложение WPF также является однопоточной моделью (STAThread), поэтому во всем приложении будет установлен диспетчер по умолчанию, который отвечает за планирование работы основного потока.

image

image

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

Итак, что, если мы являемся библиотечным проектом стандартного типа, и его необходимо обновить до некоторых элементов основного потока?

Это может быть достигнуто с помощью Application.Current.Dispacther, например, в следующем примере

На самом деле, если быть серьезным, Dispatcher of Application - это тот же объект, что и Dispatcher of Window, который мы только что использовали. Другими словами, есть только один на поток.

На самом деле, нет никакой разницы между использованием диспетчера окон и диспетчера кнопок

Последнее, что нужно сказать, это то, что Dispatcher имеет метод BeginInvoke в дополнение к методу Invoke. Разница в том, что последний выполняется асинхронно.КакКак насчет использования асинхронного механизма?

Читайте также: