C#/ .net:报告subprocess状态到父服务

我目前有一个服务运行几个subprocess(与System.Diagnostics.Process )。 每个subprocess可以运行数小时,并处于特定的预定义状态(思考“开始”,“工作”,“清理”等 – 完全预定义,不需要报告附加到每个状态的定制数据)。 每个进程不能是一个单独的Windows服务(有比Windows服务状态更多的可能状态)。 我需要以某种方式向父服务报告这种状态。 所有进程都在同一台Windows机器上运行。

我需要能够从其他进程(不是由服务启动的那些)查询subprocess状态,并且从这些subprocess更新关于每个subprocess状态的父服务。 每个进程都有唯一的ID,所以其他进程可以轻松读取状态,而无需自己pipe理进程。 所有进程共享一个configuration文件,在这个configuration文件中,每个subprocess被分配一个唯一的ID来标识自己。 我曾经想过这样做:

  • 将subprocess的标准输出redirect到服务( RedirectStandardOutput = true ),读取输出中的每一行并捕获“特殊”行( STATECHANGE:state
  • 在状态发生变化时,将所有subprocess的状态写入预定位置的文件中,在服务出口删除该文件。

它看起来像我试图find一个解决scheme,很久以前解决了这个问题,我还没有find解决scheme。 有没有什么“好”的方式来做这样的州报告?

一般来说,您正在钻研进程间通信或IPC。

虽然您没有将此问题标记为特定于Microsoft Windows,但将其标记为C#和.NET,因此您可能正在Windows环境中运行。 我的答案假设你在MS Windows中运行这个系统。

像这样的问题的常见解决方案是在数据库中存储状态。 每个服务/进程可以独立写入数据库,然后可以由任何对该信息感兴趣的进程查询。 但是这不是真正的双向沟通​​。

关于父进程如何与子进程进行通信,这可以通过多种方式进行,但是如果子进程在线程上运行某种消息泵并在另一个线程上执行数据处理,那么这可能是最简单的。 消息泵将接收并响应消息,而数据处理线程将执行其操作。

使用这个方案,消息可以以许多不同的方式交换,包括:

  • Windows通信框架(WCF)
  • 命名管道
  • .NET Remoting
  • MS消息队列(MSMQ)
  • Windows剪贴板
  • 动态数据交换(DDE)
  • 组件对象模型(COM)
  • 内存映射文件
  • 远程过程调用(RPC)
  • 套接字

由于所有这些进程都在同一台机器上运行,管道是一个简单直接的选择。 检出System.IO.Pipes命名空间

WCF允许您构建一个丰富的消息传递接口,可以在管道之上以及其他IPC机制之上实现。

在.NET上有很多讨论进程间通信的很好的资源,而不是在这里重复一遍,你应该使用诸如“.NET”,“进程间通信”,“IPC”和“本地机器“(因为在本地机器上的进程之间需要IPC)。