Я работаю над проектом, в котором я запустил 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;
}
Мое предположение состоит в том, что он не выстраивает процессы, как я вижу, когда консоль работает, то есть, когда я закрываю второе окно приложения, я ожидаю, что второй процесс завершен.