Мониторинг нескольких процессов с одинаковым именем - PullRequest
0 голосов
/ 04 мая 2018

Я работаю над проектом, в котором я запустил 4 процесса, используя класс Process, и они имеют одинаковые имена.

Я пытался использовать Process.HasExited, но, поскольку это процессы с одинаковыми именами, я не могу получить закрытое.

Я также пытался использовать 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, потому что у меня есть предопределенный «порт», который я могу использовать, поэтому в основном мне просто нужно определить номер завершенного процесса

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 голосов
/ 09 мая 2018

Как сказал 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 остается верным в этом процессе, мне нужно удалить его из dict. Когда я хочу запустить новый процесс, мне нужно создать новый ChannelFactory и сохранить его для передачи в качестве нового процесса.

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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...