如何创建 System.Diagnostics.Process 数组
How to create a System.Diagnostics.Process array
我想同时调用三个相同的 EXE,当它们全部终止时我希望得到三个 return 值,这是我目前的做法:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = MyEXEPath;
for(int i=0;i<3;i++)
{
p.StartInfo.Arguments = para1[i] + " " + para2[i];
p.Start();
Console.WriteLine("Start run");
}
p.WaitForExit();
int result = p.ExitCode;
Console.WriteLine("Return info:" + results); //Problem: I can only get the last return value
你可以看到我只有一个 return 值,不是三个,所以我想知道我是否可以这样做:
int[] results = new int[3];
System.Diagnostics.Process p[] = new System.Diagnostics.Process()[3];
for(int i=0;i<3;i++)
{
p[i].StartInfo.FileName = MyEXEPath;
p[i].StartInfo.Arguments = para1[i] + " " + para2[i];
p[i].Start();
Console.WriteLine("Start run");
p[i].EnableRaisingEvents = true;
p[i].Exited += (sender, e) =>
{
results[i] = p[i].ExitCode;
Console.WriteLine("Return info:" + results[i]);
};
}
while(results[0] != 0 && results[1] != 0 && results[2] != 0 )
{
break; //all EXEs ternimated, break and continue my job
}
肯定是编译失败 System.Diagnostics.Process p[] = new System.Diagnostics.Process()[3];
那么我该如何修复它或者还有其他方法?
你很接近,你必须删除 ()
然后为每个创建新进程:
System.Diagnostics.Process[] p = new System.Diagnostics.Process[3];
p[0] = new System.Diagnostics.Process();
p[1] = new System.Diagnostics.Process();
p[2] = new System.Diagnostics.Process();
或者,您可以使用 C# 数组初始化程序和 short-hand(隐式数组初始化)。在下面的代码中,我将在文件顶部使用 using System.Diagnostics;
来减少命名空间:
var p = new [] { new Process(), new Process(), new Process() };
创建数组并初始化元素。
据我了解,如果您稍微更改一下解决方案,它就会按照您的预期进行。
我对你的解决方案做了一些修改,它工作正常。
static void Main(string[] args)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "notepad.exe";
for (int i = 0; i < 3; i++)
{
p.StartInfo.Arguments = $"d:\text{i}.txt";
p.Start();
Console.WriteLine("Start run");
p.WaitForExit();
int result = p.ExitCode;
Console.WriteLine("Return info:" + $"text{i}.txt created successfully!");
}
p.StartInfo.FileName = "explorer.exe";
p.StartInfo.Arguments = "d:";
p.Start();
}
我想同时调用三个相同的 EXE,当它们全部终止时我希望得到三个 return 值,这是我目前的做法:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = MyEXEPath;
for(int i=0;i<3;i++)
{
p.StartInfo.Arguments = para1[i] + " " + para2[i];
p.Start();
Console.WriteLine("Start run");
}
p.WaitForExit();
int result = p.ExitCode;
Console.WriteLine("Return info:" + results); //Problem: I can only get the last return value
你可以看到我只有一个 return 值,不是三个,所以我想知道我是否可以这样做:
int[] results = new int[3];
System.Diagnostics.Process p[] = new System.Diagnostics.Process()[3];
for(int i=0;i<3;i++)
{
p[i].StartInfo.FileName = MyEXEPath;
p[i].StartInfo.Arguments = para1[i] + " " + para2[i];
p[i].Start();
Console.WriteLine("Start run");
p[i].EnableRaisingEvents = true;
p[i].Exited += (sender, e) =>
{
results[i] = p[i].ExitCode;
Console.WriteLine("Return info:" + results[i]);
};
}
while(results[0] != 0 && results[1] != 0 && results[2] != 0 )
{
break; //all EXEs ternimated, break and continue my job
}
肯定是编译失败 System.Diagnostics.Process p[] = new System.Diagnostics.Process()[3];
那么我该如何修复它或者还有其他方法?
你很接近,你必须删除 ()
然后为每个创建新进程:
System.Diagnostics.Process[] p = new System.Diagnostics.Process[3];
p[0] = new System.Diagnostics.Process();
p[1] = new System.Diagnostics.Process();
p[2] = new System.Diagnostics.Process();
或者,您可以使用 C# 数组初始化程序和 short-hand(隐式数组初始化)。在下面的代码中,我将在文件顶部使用 using System.Diagnostics;
来减少命名空间:
var p = new [] { new Process(), new Process(), new Process() };
创建数组并初始化元素。
据我了解,如果您稍微更改一下解决方案,它就会按照您的预期进行。
我对你的解决方案做了一些修改,它工作正常。
static void Main(string[] args)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "notepad.exe";
for (int i = 0; i < 3; i++)
{
p.StartInfo.Arguments = $"d:\text{i}.txt";
p.Start();
Console.WriteLine("Start run");
p.WaitForExit();
int result = p.ExitCode;
Console.WriteLine("Return info:" + $"text{i}.txt created successfully!");
}
p.StartInfo.FileName = "explorer.exe";
p.StartInfo.Arguments = "d:";
p.Start();
}