Как я могу уведомить приложение, когда настройки меняются через другое

У меня есть два проекта A и B. Где проект A — это приложение в системном трее, а проект B — основное приложение. Когда пользователь изменяет настройки проекта B, проекту A необходимо обновить себя. Как я могу уведомить проект A о происходящих изменениях?

Я пытался использовать Global Events, но для этого необходимо создать новый экземпляр приложения A в приложении B при его запуске.


person HmH    schedule 29.10.2013    source источник
comment
Вы не очень подробно рассказали. Оба приложения работают на одном компьютере? Сохраняются ли настройки в памяти или хранятся в файле на диске? Если это последнее, то есть сохраненное в файле на диске, было бы тривиально написать небольшой код для опроса файла и проверки изменений каждые x секунд или минут и т. д.   -  person Andrew    schedule 29.10.2013
comment
@ Эндрю, я думаю, можно с уверенностью предположить, что они работают на одной машине :)   -  person Moo-Juice    schedule 29.10.2013
comment
Если настройки хранятся на диске, вы можете использовать FileSystemWatcher для отслеживания изменений в файле.   -  person Eiríkur Fannar Torfason    schedule 29.10.2013
comment
Если A написано в VB.Net, вы можете проверить приложение Make single instance в Project -> Properties, а затем просто запустить его снова с помощью Process.Start() и параметра. Существующий экземпляр получит событие Application.StartupNextInstance(), из которого вы заставите этот экземпляр что-то сделать. Будет ли это полезно, зависит от того, какую информацию необходимо передать через параметры командной строки, или новые данные находятся в общем месте (базе данных?). Если вам просто нужно уведомить его о чем-то, вы можете отправить простую строку или числовой код.   -  person Idle_Mind    schedule 29.10.2013
comment
Оба приложения работают на одном компьютере, а настройки сохраняются в текстовом файле.   -  person HmH    schedule 29.10.2013


Ответы (2)


Есть несколько вариантов. Один из способов — создать именованный EventWaitHandle. Когда проект B обновляет настройки, он устанавливает событие. В проекте A есть поток, ожидающий этого события. Когда он получает уведомление, он обновляет настройки, а затем сбрасывает событие. У меня есть простой пример: Отправить сообщение от одного запущенного консольного приложения в другое

Это сработает, если проект B сохранит новые настройки где-нибудь, откуда проект A сможет их прочитать. Если вы хотите сделать это в памяти (т. е. проект B не сохраняет настройки), вам необходимо настроить какой-либо тип связи между двумя процессами. Вы можете настроить общую память с помощью MemoryMappedFile, и в этом случае вам все равно понадобится уведомление о событии.

Или вы можете настроить Именованный канал с серверным потоком в проекте B и клиентским потоком в проекте A.

person Jim Mischel    schedule 29.10.2013
comment
EventWaitHandle — хорошее решение. О Named Piped Мне также нужен поток, который ждет ответа, иначе приложение зависнет. - person HmH; 29.10.2013
comment
@HmH: вам не понадобится поток для ожидания в именованном канале. Вы можете создать клиент и выполнить асинхронное чтение с помощью BeginRead или ReadAsync. См. документацию для NamedPipeClientStream< /а>. - person Jim Mischel; 30.10.2013

Вы также можете использовать что-то вроде NancyFX, которое позволяет самостоятельному хостингу выставлять конечную точку HTTP из каждого приложения, чтобы разрешить связь без необходимости в физическом файле.

Проверьте: https://github.com/NancyFx/Nancy/wiki/Self-Hosting-Nancy

person CSharpYouDull    schedule 29.10.2013