Следующий метод не применяет изменения МОФА (фон = красный) до завершения 2-го методы (DoWork) выходит:WPF звонков не работает в течение длительного обработки метода
private void change()
{
Background = Brushes.Red;
Dispatcher.BeginInvoke((Action) DoWork);
}
DoWork() занимает несколько секунд для запуска и Я действительно не хочу помещать его в поток, так как этот код будет использоваться в нескольких местах и, вероятно, будет взаимодействовать с потоком диспетчера через различные промежутки времени. Я попытался вызвать методы Invalidate ...(), но безрезультатно. Добавлен BeginInvoke(), чтобы увидеть, будет ли задержка позволять применить изменение фона до того, как будет вызвана логика. Как правило, логика будет частью этого метода. Btw, большая часть логики выполняется в другом потоке и не должна блокировать поток Dispatcher ?!
Может кто-нибудь помочь? Спасибо
Я попытался использовать фоновый подход, но это вызывает проблему, когда изменения в пользовательском интерфейсе предпринимаются за пределами потока Диспетчер. Например, переменные, привязанные к пользовательским элементам управления, запускаются в методе DoWork(), которые генерируют исключения из-за того, что они не выполняются в потоке диспетчера. Вышеупомянутый подход также означает, что любое изменение пользовательского интерфейса от DoWork() должно быть завернуто в вызов Dispatcher (Begin) Invoke(), что означает раздутый код. Должен быть другой способ сделать это ?! Спасибо –
У вас есть три варианта: 1) запустить долговременную задачу в потоке пользовательского интерфейса и позволить блоку пользовательского интерфейса и ждать, 2) запустить его в другом потоке и решить проблемы с перекрестными потоками при попытке обновить интерфейс пользователя во время 3) не обновлять пользовательский интерфейс во время выполнения задачи. Если вы решите, что вам нужно идти с № 2, проблемы, с которыми вы сталкиваетесь, присущи.Использование «BackgroundWorker» помогает несколько; он дает вам последовательный способ изолировать код обновления UI в событии, сообщающем о ходе выполнения. Но обновление значений свойств привязки данных в фоновом потоке? № –
Простым способом решения этой проблемы является создание модели представления, привязка пользовательского интерфейса к ней и обновление модели представления из фонового потока. Таким образом, привязка данных WPF может касаться всех проблем с потоками. Непосредственное обновление пользовательского интерфейса из кода, не проходя через модель представления, всегда является плохой идеей. –