#.net #wpf #multithreading #.net-4.0 #dispatcher
#.net #wpf #многопоточность #.net-4.0 #диспетчер
Вопрос:
Недавно я столкнулся с проблемами, связанными с использованием нескольких потоков и совместным доступом к свойствам, которые привязаны к элементам управления WPF. Эти сбои, как правило, происходят в случайных местах во времени, но могут быть воспроизведены с сохранением.
Итак, что я хотел попытаться сделать, чтобы разрешить потокобезопасный доступ к данным к классам, которые привязаны к элементам управления WPF, — это получить ссылку на диспетчер потоков рендеринга и убедиться, что в моих моделях представления этот диспетчер используется для доступа к их свойствам.
Звучит ли эта концепция? Позволит ли это доступ к данным, которые привязаны к моим элементам управления, из других потоков? (под доступом я подразумеваю получение / установку).
Как я могу получить ссылку на поток рендеринга? Могу ли я просто получить ссылку на поток, который создает экземпляр класса App?
Спасибо, Алекс.
Ответ №1:
Насколько я знаю, я думаю Application.Current.Dispatcher
, что всегда предоставит вам диспетчер пользовательского интерфейса, поэтому на самом деле нет необходимости иметь специальный код для получения доступа к диспетчеру отправки данных (который должен быть самим диспетчером пользовательского интерфейса).
Комментарии:
1. Исключение (в крайнем случае) заключается в том, что возможно иметь несколько диспетчеров: если вы создаете поток и создаете окно из этого потока, у него будет другой поток диспетчера и пользовательского интерфейса.
2. В WPF для этого потребуется другой поток STA. Но в WPF может существовать только один STA, который является пользовательским интерфейсом. Поправьте меня, если я ошибаюсь.