Использование Invoke с элементом пользовательского интерфейса, который расширяет контекст приложения? - PullRequest
3 голосов
/ 23 июня 2010

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

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

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

Я действительно ценю любую помощь!

badPanda

1 Ответ

1 голос
/ 23 июня 2010

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

...