我目前有一个Windows进程,它是由Web上的用户操作启动的。此过程开始时,任务管理器内的进程列表中会显示一个项目。有时我会运行相同进程的三个或四个实例。该流程的每个实例都与作业ID相关联。
我使用推送系统,其中进程本身将在RESTful端点执行其工作时进行ping操作(la heartbeat)。我想改用拉系统。有没有办法让我通过命令行查询Windows任务管理器,并找出每个流程实例对应的作业ID?
我的流程是用C#编写的。
答案 0 :(得分:0)
实现进程间通信的一种可能方法是使用named pipes。
每个作业进程充当命名管道服务器,其名称包括进程ID。服务器在单独的线程中运行,等待客户端连接并将作业ID写入流:
var jobId = Guid.NewGuid();
var jobIdBytes = jobId.ToByteArray();
var pid = Process.GetCurrentProcess().Id;
var pipeName = "pipe" + pid;
var running = true;
new Thread(() =>
{
using (var pipeServer = new NamedPipeServerStream(pipeName))
{
while (running)
{
pipeServer.WaitForConnection();
pipeServer.Write(jobIdBytes, 0, jobIdBytes.Length);
pipeServer.Disconnect();
}
}
}).Start();
查询作业ID的应用程序将循环遍历所有正在运行的作业进程,连接到它们的管道并从流中读取作业ID:
var jobIdBytes = new byte[16];
foreach (var process in Process.GetProcessesByName("jobProcessName"))
{
var pipeName = "pipe" + process.Id;
using (var clientStream = new NamedPipeClientStream(pipeName))
{
clientStream.Connect();
clientStream.Read(jobIdBytes, 0, jobIdBytes.Length);
}
var jobId = new Guid(jobIdBytes);
Console.WriteLine(String.Format("pid: {0}, job_id: {1}", process.Id, jobId));
}