C#/.NET:向父服务报告子进程状态

C#/.NET: Reporting subprocess state to the parent service

我目前有一个服务 运行 有几个子进程(System.Diagnostics.Process)。每个子流程可以 运行 数小时并处于特定的预定义状态(想想 "starting"、"working"、"cleaning up" 等 - 完全预定义,每个状态都没有附加自定义数据必须申报)。每个进程不能是单独的 Windows 服务(可能的状态比 Windows 服务状态多)。我需要以某种方式将此状态报告给父服务。所有进程 运行 都在同一台 Windows 机器上。

我需要能够从其他进程(不是由服务启动的进程)查询子进程状态,并从这些子进程更新有关每个子进程状态的父服务。每个进程都有一个唯一的 ID,因此其他进程可以轻松读取状态,而无需自己管理进程。所有进程共享一个配置文件,其中每个子进程都被分配了一个唯一的 ID 来标识自己。我考虑过这样做:

看来我正在尝试为很久以前解决的问题找到解决方案,但我还没有找到该解决方案。有什么 "nice" 方法可以进行这种状态报告吗?

一般来说,您正在深入研究进程间通信或 IPC 领域。

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

解决此类问题的常见方法是在数据库中存储状态。每个 service/process 都可以独立地写入数据库,然后任何对该信息感兴趣的进程都可以查询它。但这不是真正的双向通信。

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

使用此方案,可以通过多种不同方式交换消息,包括:

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

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

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

I'net 上有很多讨论 .NET 上的进程间通信的好资源,与其在这里重复这些内容,不如使用“.NET”等术语搜索这些资源,"interprocess communications" ,"IPC" 和 "local machine"(因为您需要在本地计算机上的进程之间进行 IPC)。