Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

Изменение нескольких параметров из другого потока

#c_sharp #wpf


Есть другой поток, в нем должны изменяться контролы окна. А именно Image и ее свойство
ToolTip. Код в WPF:




Код в C#: 

FFM.Dispatcher.Invoke(new ThreadStart(delegate {; FFM.IconState.ToolTip = "Example
tip 2"; })); //Обновляем ToolTip
BitmapImage ImageP = new BitmapImage(new Uri("/Images/ExImage2.png", UriKind.Relative));
//Объявляем изображение 
FFM.Dispatcher.Invoke(new ThreadStart(delegate {; FFM.IconState.Source = ImageP;
})); //Меняем изображение


На последней строчке у нас возникает исключение: System.InvalidOperationException:
"Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого
объекта является другой поток."

Почему так происходит? Ведь Dispatcher.Invoke не позволяет выполнению кода идти дальше,
пока не придет ответ от диспетчера, тоесть ошибки по идее не должно существовать.
    


Ответы

Ответ 1



Проблема в том, что вы создаёте BitmapImage не в UI-потоке. Он считается при этом принадлежащим фоновому потоку (это и есть тот самый «другой поток» из вашего сообщения об ошибке), и не может использоваться в других потоках. Выхода из этой ситуации возможно два: Создавайте его в UI-потоке, используя тот же Dispatcher. Открепите ваш BitmapImage от создавшего его потока при помощи ImageP.Freeze(). При этом, правда, вы не сможете больше менять свойства этого объекта BitmapImage (но с хорошими шансами вам это и не нужно). Кстати, вы можете вызывать код более просто синтаксически: FFM.Dispatcher.Invoke(() => { FFM.IconState.ToolTip = "Example tip 2"; }); или даже FFM.Dispatcher.Invoke(() => FFM.IconState.ToolTip = "Example tip 2");

Комментариев нет:

Отправить комментарий