如何在 .NET 程序之间共享信息

Posted

技术标签:

【中文标题】如何在 .NET 程序之间共享信息【英文标题】:How to share information between .NET programs 【发布时间】:2015-08-05 07:32:23 【问题描述】:

我正在开发 .NET Web 应用程序,该应用程序也在后台运行不同的作业。这些后台作业更新数据库、创建报告文件、删除旧文件等。

作业按计划触发,并且计划程序本身通过 Windows 的任务计划程序每小时触发一次。

到目前为止,我一直通过将消息记录到 Windows 事件查看器来监视作业的状态,但是这种方法非常麻烦。 我想实现一个带有 GUI 的新程序,该程序将与作业通信并监视它们的活动。启动时 gui 应显示以下信息:

状态(运行与空闲) 进度条(“24% 完成”、“23423 个项目中的 327 个已完成”)

gui.exe 应该独立于 jobs.exe 运行(启动或停止 gui 不应影响作业,反之亦然)。

我正在寻找建议,在 jobs.exe 和 gui.exe 之间共享信息的最佳方式是什么

【问题讨论】:

“什么是共享信息的最佳方式”有很多方法:对于特定用途,哪种方式更好(我怀疑任何一种都是“最好的”)取决于细节。就我个人而言,我会关注 WMI,因为它可以启用远程和命令行(自动)监控。还希望公开性能计数器。 不要重新发明***。使用操作系统的机制——性能计数器、Windows 事件等。.NET 已经支持它们。有很多工具(GUI 和其他工具)使用它们进行仪表板、警报、监控等 【参考方案1】:

一般性答案 - 所有形式的 IPC 都涉及使用一些可由两个进程访问的共享资源。示例:

网络套接字(以“网络”作为共享资源) 命名管道 共享内存 普通的旧磁盘文件(不是进行 IPC 的最佳方式,但仍然是一种有效的方式) 共享数据库

特定的 .NET 选项:

远程处理 WCF 网络 API 命名管道

仅举几例。

研究其中一些,看看它们是否适合您的用例

【讨论】:

请注意,OP 实际上是在询问 monitoring 应用程序,但假定需要 IPC。【参考方案2】:

取决于 gui.exe 是否与您的作业服务在同一系统上运行。如果是这样,那么最好不要使用任何 web api / 网络套接字 / WCF 进行通信,而是使用更简单的 IPC 方法。我个人喜欢消息队列。

【讨论】:

以上是关于如何在 .NET 程序之间共享信息的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET MVC 中的 2 个不同项目/应用程序之间共享母版页?

如何在两个 .NET AppDomain 之间传递未知类型?

如何使用 WatchConnectivity 在我的 iOS 和 Watch 应用程序之间共享信息?

Sencha Touch 2:数据集成或如何在sencha和javascript之间共享动态信息

.NET 进程和 AppDomain 在啥情况下会共享内存中加载的程序集?

如何在 http 和 https 之间共享 asp.net 会话