Правильный подход к изменению элементов GUI из рабочего потока с помощью Dispatcher? - PullRequest
1 голос
/ 13 октября 2010

У меня есть небольшая проблема, когда я хочу изменить элементы графического интерфейса из различных рабочих потоков.До сегодняшнего дня метод, который я использовал, работал, но, скорее всего, он был очень неправильным.

Самый простой случай - это графический интерфейс моего плагина, который что-то делает в рабочем потоке, и когда этот метод завершает свою работу, он вызываетмой обратный звонокЭтот метод обратного вызова обрабатывается из того же потока, поэтому он не может выполнять работу с графическим интерфейсом.Однако, когда GUI моего плагина отображается в графическом интерфейсе моего основного приложения, мой GUI плагина кэширует свою ссылку на Dispatcher - когда мне нужно обновить GUI (или в этом случае отобразить диалог), я вызываю Dispatcher.Invoke (...).

Существует ли какая-либо внутренняя опасность при настройке Dispatcher в моих плагинах следующим образом?

Сегодня у меня возникла новая проблема с этим подходом.Моему приложению необходимо вызвать этот метод в моем плагине, который запускает рабочий поток и отображает диалоговое окно.Если я вызову метод до того, как открою графический интерфейс плагина (который кэширует ссылку на Dispatcher), операция завершится ошибкой, поскольку Dispatcher имеет значение null.Я всегда проверяю это, чтобы убедиться, что приложение не падает.Однако теперь, когда диалоговое окно не отображается, необходимые пользовательские взаимодействия не могут быть продолжены.

Может кто-нибудь предложить лучший способ использования диспетчера, чтобы гарантировать, что я могу отображать / изменять элементы графического интерфейса плагина из моего основного приложения?Единственное, о чем я могу думать сейчас, - это чтобы мое основное приложение передавало ссылку на Dispatcher в мой загрузчик плагинов, добавлял метод «SetDispatcher» в интерфейс моего плагина, а затем вызывал загрузчик плагинов для каждого плагина, который должен бытьзагружен.

Ответы [ 2 ]

0 голосов
/ 14 октября 2010

На данный момент я обнаружил, что хорошее решение, подходящее или нет, - экспортировать Dispatcher основного потока через MEF, а затем разрешить всем модулям импортировать его.Кажется, сейчас это самый чистый способ борьбы с подобными вещами.

0 голосов
/ 14 октября 2010

Если GUI вашего плагина должен существовать к моменту завершения фонового потока, вам, вероятно, следует убедиться, что создание / создание плагина GUI происходит до того, как вы отключите этот фоновый процесс.Таким образом, Dispatcher GUI элемента (ов) плагина устанавливается платформой до завершения асинхронных операций.

На более высоком уровне (вы можете или не можете решить эту проблему), кажется, что вы 'у нас есть неуместная связь между GUI и тем, что происходит в фоновом режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...