监视具有相同名称的多个进程

时间:2018-05-04 07:09:20

标签: c# wcf process

我正在开发一个项目,我使用Process类启动了4个进程,它们具有相同的名称。

我尝试使用Process.HasExited,但由于它的进程名称相同,我无法真正得到一个已关闭的进程。

我也尝试使用ID,因为它们确实有不同的ID,但它并没有像我想象的那样工作,例如。当我关闭第二个流程窗口,然后检查哪个ID丢失时,他没有返回第二个ID丢失,它总是随机

我也使用WCF连接,并且我有CheckState方法,我的所有代理每五秒钟调用一次,所以当进程数小于4时,它返回错误,我知道一个过程已经结束。

这就是我开始流程的方式

        for (int i = 0; i < 4; ++i)
        {
            try
            {
                Process.Start(path, Containers.Path.ports[i]);
                NetTcpBinding binding = new NetTcpBinding();
                ChannelFactory<IContainer> factory = new ChannelFactory<IContainer>(binding, new EndpointAddress($"net.tcp://localhost:{Containers.Path.ports[i]}/IContainer")); 
                proxies.Add(factory.CreateChannel());
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);

            }
        }

这就是我检查哪个进程已经停止并且我从0-3返回数字的原因,因为我预先定义了&#34; port&#34;我可以使用,所以基本上我只需要确定退出流程的数量

private static int GetID(Dictionary<int, int> processesIDs, Process[] newProcessList)
    {
        int cnt=0;
        int ret = -1;

        foreach (var p in processesIDs)
        {
            if(cnt == newProcessList.Length)
            {
                ret = p.Value;
                break;
            }else
            {
                cnt = 0;
                for (int i = 0; i < newProcessList.Length; ++i)
                {
                    if (p.Key != newProcessList[i].Id)
                    {
                        cnt++;
                    }
                }
            }

        }

        if(ret == -1)
        {
            ret = 4;
        }else
        {
            ret = ret - 1;
        }

        return ret;
    }

我的假设是他没有像我在控制台运行时看到的那样排队流程,这意味着当我关闭第二个应用程序窗口时,我希望第二个流程完成。

1 个答案:

答案 0 :(得分:0)

正如Evenhuis所说,我在开始时存储了流程,当我创建流程时,我将其存储在public static Dictionary<Process, string>中。

稍后,当我想检查哪一个退出时,我只是使用这个方法

public static string GetPort(Dictionary<Process, string> OriginalprocessesIDs)
    {
        string ret = "";
        foreach(var p in processesIDs)
        {
            if(p.Key.HasExited)
            {
                ret = p.Value;
                OriginalprocessesIDs.Remove(p.Key);
                return ret;
            }
        }

        return ret;
    }

因为hasExited属性在此过程中保持为true,所以我需要将其从dict中删除。当我想开始新的流程时,我需要创建新的ChannelFactory并将其保存为dict作为新流程。

public static void StartSingleProcess(string port)
    {
        Process p = Process.Start(Containers.Path.location, port);
        NetTcpBinding binding = new NetTcpBinding();
        binding.OpenTimeout = new TimeSpan(0, 10, 0);
        binding.CloseTimeout = new TimeSpan(0, 10, 0);
        binding.SendTimeout = new TimeSpan(0, 10, 0);
        binding.ReceiveTimeout = new TimeSpan(0, 10, 0);
        ChannelFactory<IContainer> factory = new ChannelFactory<IContainer>(binding, new EndpointAddress($"net.tcp://localhost:{port}/IContainer")); // moraju se cuvati proxiji zbog poziva metode load n puta 
        proxies.Add(factory.CreateChannel());
        OriginalprocessesIDs.Add(p, port);
    }