У меня есть два потока пользовательского интерфейса, один из которых является основным потоком, а другой — фоновым потоком, чей ApartmentState — STA. Каждый поток создает свое собственное окно, а в фоновом окне есть кнопка «Отмена».
Основной поток имеет функцию, которая занята и требует довольно много времени для завершения. Я надеюсь, что после нажатия кнопки «Отмена» основной поток должен остановить отнимающую много времени функцию.
Ниже приведен псевдокод в основном потоке:
за(...) {
//Option A: Application.DoEvents(); //Option B: Dispatcher.Invoke to update UI in background thread if(cancel) return; //Stop the time-consuming function else DoSomething;
}
Странно то, что событие нажатия кнопки «Отмена» НЕ захватывается и не обрабатывается фоновым потоком. IMO, каждый поток имеет свою собственную очередь сообщений, и когда я нажимаю кнопку «Отмена», это сообщение должно быть поставлено в очередь и немедленно обработано фоновым потоком, но, согласно моему локальному тесту, это не так, фоновый поток никогда не обрабатывает событие нажатия кнопки...
Какие-нибудь мысли?
Кстати, я думаю, что есть два способа решить вышеуказанную проблему: один — использовать Application.DoEvents, а другой — использовать Dispatcher.Invoke. Но мне все еще любопытно, почему фоновый поток НЕ может сразу обработать сообщение. Заранее спасибо.
Application.DoEvents
не существует в WPF... Как вы это реализовали? - person Reed Copsey   schedule 02.05.2013