Использование Invoke с элементом пользовательского интерфейса, который расширяет контекст приложения?
У меня есть элемент taskBarIcon, расширяющий контекст приложения, из которого спроектирован весь мой пользовательский интерфейс. Это происходит потому, что первоначальная функциональность приложения состояла в том, чтобы запустить фоновый процесс и просто предоставить значок в качестве подтверждения того, что приложение работает. Однако теперь я добавляю дополнительную функциональность в виде меню, доступ к которому можно получить, щелкнув правой кнопкой мыши значок, и поскольку основная функциональность выполняется в одном потоке, а значок-в основном потоке, у меня есть проблемы с доступом к значку в простом случае необходимости отображения пузырька уведомлений. Нет никаких других точек, в которых два потока могут обращаться к одной и той же памяти, так что синхронизация на самом деле не является проблемой.
Я привык к Java, в которой этот процесс намного проще. Я читал статьи, которые я могу найти относительно танца Invoke-Delegate, который требует C#, но ни одна из них не является специфичной для объекта, расширяющего контекст приложения. Моя нынешняя реализация слишком непредсказуема, чтобы быть производство безопасно.
Мой вопрос заключается в следующем: как я могу отправить сообщение другому процессу для отображения пузырька уведомлений, не нарушая доступность меню? В частности, простой пример с UI-классом, расширяющим контекст приложения, и классом в отдельном потоке, вызывающем метод invoke, был бы очень полезен.
Я очень ценю любую помощь!
BadPanda
1 ответ:
С таким же успехом можно использовать объект
SynchronizationContext
, назначенный объектуSynchronizationContext.Current
в том же потоке, в котором создается пузырь уведомлений. Затем вы передадите свой объектSynchronizationContext
в любой компонент меню, и он будет использоватьcontext.Send(....)
для отправки сообщения. Или, если у вас есть доступ к компоненту пузырь уведомлений или форме, в которой он находится, Вы можете сделатьform.Invoke((MethodInvoker)delegate {....});