我正在开发一个项目,我使用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;
}
我的假设是他没有像我在控制台运行时看到的那样排队流程,这意味着当我关闭第二个应用程序窗口时,我希望第二个流程完成。
答案 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);
}