У меня есть небольшая проблема, когда я хочу изменить элементы графического интерфейса из различных рабочих потоков.До сегодняшнего дня метод, который я использовал, работал, но, скорее всего, он был очень неправильным.
Самый простой случай - это графический интерфейс моего плагина, который что-то делает в рабочем потоке, и когда этот метод завершает свою работу, он вызываетмой обратный звонокЭтот метод обратного вызова обрабатывается из того же потока, поэтому он не может выполнять работу с графическим интерфейсом.Однако, когда GUI моего плагина отображается в графическом интерфейсе моего основного приложения, мой GUI плагина кэширует свою ссылку на Dispatcher - когда мне нужно обновить GUI (или в этом случае отобразить диалог), я вызываю Dispatcher.Invoke (...).
Существует ли какая-либо внутренняя опасность при настройке Dispatcher в моих плагинах следующим образом?
Сегодня у меня возникла новая проблема с этим подходом.Моему приложению необходимо вызвать этот метод в моем плагине, который запускает рабочий поток и отображает диалоговое окно.Если я вызову метод до того, как открою графический интерфейс плагина (который кэширует ссылку на Dispatcher), операция завершится ошибкой, поскольку Dispatcher имеет значение null.Я всегда проверяю это, чтобы убедиться, что приложение не падает.Однако теперь, когда диалоговое окно не отображается, необходимые пользовательские взаимодействия не могут быть продолжены.
Может кто-нибудь предложить лучший способ использования диспетчера, чтобы гарантировать, что я могу отображать / изменять элементы графического интерфейса плагина из моего основного приложения?Единственное, о чем я могу думать сейчас, - это чтобы мое основное приложение передавало ссылку на Dispatcher в мой загрузчик плагинов, добавлял метод «SetDispatcher» в интерфейс моего плагина, а затем вызывал загрузчик плагинов для каждого плагина, который должен бытьзагружен.