Как обновить окно windows form
WPF: Как обновить элементы пользовательского интерфейса формы в рабочем потоке (механизм Dispatcher)
Это общая проблема: если мы используем больше в программенитьТехнология покаработаЕсли поток (фоновый поток) должен обновить элементы интерфейса (например, индикатор выполнения и т. Д.), Возникнет проблема безопасности потока, поскольку индикатор выполнения создается основным потоком.
На данный момент, примерно,WPFМеханизм не отличается от Windows Forms. Нам нужно обновить следующим образом в Windows FormsформыЭлементы.
Во-первых, это неправильный способ записи, это приведет к ошибке во время выполнения.
Зная это, давайте посмотрим, как делается WPF?
Если вы нажмете первую кнопку, мы также получим ошибку
Нажмите вторую кнопку, она работает нормально
Посмотрим какая разница в коде
Обратите внимание, что класс Window не имеет метода Invoke, который отличается от Form. Вместо этого нам нужно получить доступ к свойству Window.Dispatcher и затем вызвать метод Invoke. Больше ничего
Хорошо, так что же такое Диспетчер? Буквально это означает так называемый оператор или диспетчер. Что это значит? У каждого потока есть уникальный диспетчер, и работа, которую мы выполняем в коде, на самом деле заключается в том, чтобы выдавать инструкции диспетчеру, а затем он сделает это за нас. Это верно.
Наша форма создается в главном потоке, и элементы управления внутри, естественно, одинаковы. Ранее мы объяснили, что приложение WPF также является однопоточной моделью (STAThread), поэтому во всем приложении будет установлен диспетчер по умолчанию, который отвечает за планирование работы основного потока.
С этой точки зрения, если мы сами напишем элемент управления для WPF, то нам нужно наследовать в соответствии с этой иерархией. Таким образом, внутри элемента управления вы можете обновить некоторые элементы интерфейса с помощью этого диспетчера.
Итак, что, если мы являемся библиотечным проектом стандартного типа, и его необходимо обновить до некоторых элементов основного потока?
Это может быть достигнуто с помощью Application.Current.Dispacther, например, в следующем примере
На самом деле, если быть серьезным, Dispatcher of Application - это тот же объект, что и Dispatcher of Window, который мы только что использовали. Другими словами, есть только один на поток.
На самом деле, нет никакой разницы между использованием диспетчера окон и диспетчера кнопок
Последнее, что нужно сказать, это то, что Dispatcher имеет метод BeginInvoke в дополнение к методу Invoke. Разница в том, что последний выполняется асинхронно.КакКак насчет использования асинхронного механизма?
Читайте также: