je-wo Ответов: 1

Обновление связанных элементов управления WPF из другого потока


В настоящее время я сталкиваюсь с проблемой обновления элементов управления WPF из рабочего потока.
После нескольких часов поиска в Google я надеюсь получить ответ здесь.

Ситуация:
- У меня действительно есть графический интерфейс
- Графический интерфейс имеет прикрепленную к нему viewmodel
- Видемодель содержит все свойства для привязки. Он содержит значения свойств int, float, bool и string, а также массив int [].
- Все свойства выглядят так:
private volatile string _InputTypeString = "";
public string InputTypeString
{
    get { return _InputTypeString; }
    set { _InputTypeString = value; OnPropertyChanged("InputTypeString"); }
}

- Все элементы управления привязаны к viewmodel с помощью XML-Привязок
- Когда я не использую обновления графического интерфейса, мой код работает нормально в течение нескольких часов, и как только я обновляю графический интерфейс, я сталкиваюсь с проблемами в течение нескольких минут.

Что я уже пробовал:

То, что я уже пробовал:

- сделайте все переменные объектов свойств изменчивыми

- делегаты через
Action b = delegate { windowmodel.Frame_Current = FrameX };
Application.Current.Dispatcher.Invoke(b, DispatcherPriority.Normal);

- защелкивания:
lock (windowmodel.AudioLevelArray)



Есть идеи, как сделать потокобезопасными свойства, связанные с графическим интерфейсом?

George Swan

Вы сообщаете о ходе выполнения вашего асинхронного метода или обновляете пользовательский интерфейс только после завершения вашего метода?

VR Karthikeyan

С какой реальной проблемой вы столкнулись при обновлении графического интерфейса, есть ли какое-либо исключение или сообщение об ошибке?

Richard Deeming

Репост
Вы уже опубликовали это на форуме C# :
https://www.codeproject.com/Messages/5481113/Update-bound-WPF-controls-from-another-thread.aspx[^]

1 Ответов

Рейтинг:
0

johannesnestler

run into problems within a couple of minutes


Какие Проблемы? Судя по остальному вопросу, вы подозреваете, что проблема заключается в многопоточности. Но вы не показали никакого кода, связанного с этим, Вы упомянули некоторые стандартные "шаблоны решений" для таких проблем, но как мы можем сказать, правильно ли вы их применили?

Что я могу сказать (работая с WPF и MVVM в течение многих лет), что многопоточность не является проблемой, если вы правильно отправляете изменения из других потоков.

Поэтому, если ваш (асинхронный) метод не сообщает о прогрессе - просто сообщите результат в правильном (GUI) потоке (путем диспетчеризации)-не используйте никаких общих переменных, чтобы облегчить себе жизнь.

Но я подозреваю, что у вас может быть какая-то другая проблема... потому что если вы сделали что-то не так с диспетчеризацией, то обычно не требуется нескольких минут, чтобы сгенерировать ошибку (или ваш асинхронный метод работает так долго?)

Поэтому я сейчас прекращаю задавать вопросы - покажи нам настоящую ошибку или исключение - тогда мы сможем попытаться найти причину..