Элементы WPF, отображаемые в одном окне, обладают потоковым родством (thread affinity). Это означает, что поток, который их создал, владеет ими, а другие потоки не могут взаимодействовать с этими элементами напрямую. С набором элементов, обладающих потоковым родством, связан диспетчер, который принимает методы и ставит их на выполнение в очередь потока элементов. Чтобы элемент мог обладать потоковым родством и иметь доступ к диспетчеру, он должен наследоваться от класса DispatcherObject. Этот класс имеет всего три члена:
Dispatcher – свойство, возвращающее диспетчер потока;
CheckAccess() – метод возвращает true, если код выполняется в потоке элемента;
VerifyAccess() – если вызывающий код находится не в потоке элемента, данный метод генерирует исключение InvalidOperationException.
Диспетчер – это экземпляр класса System.Windows.Threading.Dispatcher. Метод диспетчера BeginInvoke() используется для того, чтобы спланировать код в качестве задачи для диспетчера:
// предположим, что это обработчик нажатия некоторой кнопки
private void btn_Click(object sender, RoutedEventArgs e)
|
|
{
// запускаем новый метод в отдельном потоке
new Thread(UpdateTextRight).Start();
}
private void UpdateTextRight()
{
// обновим интерфейс - у диспетчера окна вызываем BeginInvoke()
Dispatcher.BeginInvoke((Action)(() => txt.Text = "New text"));
}
Для организации в приложении WPF асинхронного выполнения можно использовать объект класса System.ComponentModel.BackgroundWorker. Основные элементы этого класса:
RunWorkerAsync() – метод стартует асинхронную операцию. Имеется перегруженная версия, принимающая аргумент асинхронной операции.
CancelAsync() – запрос на отмену асинхронной операции.
DoWork – обработчик этого события будет асинхронной операцией.
RunWorkerCompleted – это событие генерируется, если асинхронная операция завершилась, была отменена или прекращена из-за исключения.
IsBusy – булево свойство; позволяет узнать, выполняется ли операция.
Варианты организации приложений WPF
Приложения WPF допускают несколько способов организации. Самый распространённый вариант – приложение в виде набора окон. Альтернативой являются приложения на основе страниц.