Использование Invoke с элементом пользовательского интерфейса, который расширяет контекст приложения?


У меня есть элемент taskBarIcon, расширяющий контекст приложения, из которого спроектирован весь мой пользовательский интерфейс. Это происходит потому, что первоначальная функциональность приложения состояла в том, чтобы запустить фоновый процесс и просто предоставить значок в качестве подтверждения того, что приложение работает. Однако теперь я добавляю дополнительную функциональность в виде меню, доступ к которому можно получить, щелкнув правой кнопкой мыши значок, и поскольку основная функциональность выполняется в одном потоке, а значок-в основном потоке, у меня есть проблемы с доступом к значку в простом случае необходимости отображения пузырька уведомлений. Нет никаких других точек, в которых два потока могут обращаться к одной и той же памяти, так что синхронизация на самом деле не является проблемой.

Я привык к Java, в которой этот процесс намного проще. Я читал статьи, которые я могу найти относительно танца Invoke-Delegate, который требует C#, но ни одна из них не является специфичной для объекта, расширяющего контекст приложения. Моя нынешняя реализация слишком непредсказуема, чтобы быть производство безопасно.

Мой вопрос заключается в следующем: как я могу отправить сообщение другому процессу для отображения пузырька уведомлений, не нарушая доступность меню? В частности, простой пример с UI-классом, расширяющим контекст приложения, и классом в отдельном потоке, вызывающем метод invoke, был бы очень полезен.

Я очень ценю любую помощь!

BadPanda

1 3

1 ответ:

С таким же успехом можно использовать объект SynchronizationContext, назначенный объекту SynchronizationContext.Current в том же потоке, в котором создается пузырь уведомлений. Затем вы передадите свой объект SynchronizationContext в любой компонент меню, и он будет использовать context.Send(....) для отправки сообщения. Или, если у вас есть доступ к компоненту пузырь уведомлений или форме, в которой он находится, Вы можете сделать form.Invoke((MethodInvoker)delegate {....});