【问题标题】: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() 事件,您可以在该事件中使该实例执行某些操作。这是否有用取决于需要通过命令行参数传递哪些信息,或者新数据是否位于公共位置(数据库?)。如果您只需要“通知”它做某事,那么您可以发送一个简单的字符串或数字代码。
  • 两个应用程序在同一台机器上运行,并且设置保存在一个文本文件中。

标签: c# vb.net multi-project


【解决方案1】:

有多种选择。一种方法是创建一个名为EventWaitHandle。当项目 B 更新设置时,它会设置事件。项目 A 有一个等待该事件的线程。当它收到通知时,它会从设置中更新,然后重置事件。我这里有一个简单的例子:Send message from one running console app to another

如果项目 B 将新设置存储在项目 A 可以读取它们的位置,这将起作用。如果您想在内存中执行此操作(即项目 B 不保留设置),那么您需要在两个进程之间设置某种类型的通信。您可以使用MemoryMappedFile 设置共享内存,在这种情况下您仍然需要事件通知。

或者您可以设置Named Pipe,在项目 B 中使用服务器流,在项目 A 中使用客户端流。

【讨论】:

  • EventWaitHandle 是一个很好的解决方案。关于命名管道我还需要一个等待响应的线程,否则应用程序将挂起。
  • @HmH:您不需要线程来等待命名管道。您可以创建客户端并使用BeginReadReadAsync 进行异步读取。请参阅NamedPipeClientStream 的文档。
【解决方案2】:

您还可以使用 NancyFX 之类的东西,它允许自托管从每个应用程序公开一个 HTTP 端点,以允许在不需要物理文件的情况下进行通信。

查看: https://github.com/NancyFx/Nancy/wiki/Self-Hosting-Nancy

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2016-04-24
    • 2012-04-28
    相关资源
    最近更新 更多