当设置通过另一个更改时,如何通知应用程序
Posted
技术标签:
【中文标题】当设置通过另一个更改时,如何通知应用程序【英文标题】:How can I notify an application when settings are change through another one 【发布时间】:2013-10-29 14:38:20 【问题描述】:我有两个项目 A 和 B。其中项目 A 是系统托盘应用程序,项目 B 是主应用程序。 当用户更改项目 B 的设置时,项目 A 需要自行更新。 如何将发生的更改通知项目 A?
我曾尝试使用全局事件,但这需要在应用 B 启动时创建应用 A 的新实例。
【问题讨论】:
你没有提供太多细节。应用程序是否都在同一台机器上运行?设置是保存在内存中还是存储在磁盘上的文件中?如果是后者,即存储在磁盘上的文件中,那么编写一点代码来轮询文件并每隔 x 秒或分钟检查一次更改等将是微不足道的。 @Andrew,我认为假设它们在同一台机器上运行是安全的 :) 如果设置存储在磁盘上,您可以使用FileSystemWatcher
来监控文件的更改。
如果 A
是用 VB.Net 编写的,那么您可以在 Project --> Properties 中检查“Make single instance application”,然后使用 Process.Start() 再次“运行”它并一个参数。现有实例将收到一个 Application.StartupNextInstance() 事件,您可以在该事件中使该实例执行某些操作。这是否有用取决于需要通过命令行参数传递哪些信息,或者新数据是否位于公共位置(数据库?)。如果您只需要“通知”它做某事,那么您可以发送一个简单的字符串或数字代码。
两个应用程序在同一台机器上运行,并且设置保存在一个文本文件中。
【参考方案1】:
有多种选择。一种方法是创建一个名为EventWaitHandle。当项目 B 更新设置时,它会设置事件。项目 A 有一个等待该事件的线程。当它收到通知时,它会从设置中更新,然后重置事件。我这里有一个简单的例子:Send message from one running console app to another
如果项目 B 将新设置存储在项目 A 可以读取它们的位置,这将起作用。如果您想在内存中执行此操作(即项目 B 不保留设置),那么您需要在两个进程之间设置某种类型的通信。您可以使用MemoryMappedFile 设置共享内存,在这种情况下您仍然需要事件通知。
或者您可以设置Named Pipe,在项目 B 中使用服务器流,在项目 A 中使用客户端流。
【讨论】:
EventWaitHandle 是一个很好的解决方案。关于命名管道我还需要一个等待响应的线程,否则应用程序将挂起。 @HmH:您不需要线程来等待命名管道。您可以创建客户端并使用BeginRead
或ReadAsync
进行异步读取。请参阅NamedPipeClientStream 的文档。【参考方案2】:
您还可以使用 NancyFX 之类的东西,它允许自托管从每个应用程序公开一个 HTTP 端点,以允许在不需要物理文件的情况下进行通信。
查看: https://github.com/NancyFx/Nancy/wiki/Self-Hosting-Nancy
【讨论】:
以上是关于当设置通过另一个更改时,如何通知应用程序的主要内容,如果未能解决你的问题,请参考以下文章
当实体集 ChangeTracker 发生更改时如何通知 UI