如何创建System.Diagnostics.Process数组并获取多EXE进程的各自退出码
问题分析
你的原代码核心问题很清晰:你一直在复用同一个System.Diagnostics.Process实例来启动三个进程。每次调用p.Start()时,相当于用新的参数覆盖了这个实例的原有配置并启动新进程,之前启动的进程信息直接被覆盖了。最后调用p.WaitForExit()只会等待最后启动的那个进程,自然只能拿到它的退出码。
解决方案:使用Process数组管理多进程
我们需要为每个要启动的进程单独创建Process实例,并用数组存储这些实例,这样就能分别跟踪每个进程的状态和退出码。下面是完整的实现代码:
// 假设你已经定义好以下变量 string MyEXEPath = "你的目标EXE路径"; string[] para1 = new string[] { "参数组1-1", "参数组1-2", "参数组1-3" }; string[] para2 = new string[] { "参数组2-1", "参数组2-2", "参数组2-3" }; // 创建Process数组,对应要启动的3个进程 System.Diagnostics.Process[] processes = new System.Diagnostics.Process[3]; // 循环启动每个进程 for (int i = 0; i < 3; i++) { // 为每个进程创建独立的Process实例 System.Diagnostics.Process p = new System.Diagnostics.Process(); p.StartInfo.FileName = MyEXEPath; p.StartInfo.Arguments = $"{para1[i]} {para2[i]}"; // 字符串插值让参数拼接更清晰 p.Start(); Console.WriteLine($"已启动第{i+1}个进程"); // 将实例存入数组,方便后续跟踪状态 processes[i] = p; } // 收集所有进程的返回值 List<int> exitCodes = new List<int>(); foreach (var process in processes) { // 等待当前进程执行完毕 process.WaitForExit(); // 记录该进程的退出码 exitCodes.Add(process.ExitCode); // 手动释放进程资源(推荐操作,避免内存泄漏) process.Dispose(); } // 输出所有进程的返回结果 Console.WriteLine("所有进程返回值:"); for (int i = 0; i < exitCodes.Count; i++) { Console.WriteLine($"第{i+1}个进程返回值:{exitCodes[i]}"); }
额外说明
- 独立实例的必要性:每个进程对应单独的
Process实例,彻底避免了复用同一实例导致的状态覆盖问题,确保每个进程的信息都能被独立跟踪。 - 并行vs串行执行:上面的代码是先启动所有进程,再统一等待全部结束,属于并行执行;如果需要串行启动(启动一个等它结束再启动下一个),可以把
WaitForExit()放到启动循环里,但这样会降低执行效率。 - 自动资源释放:你也可以用
using语句自动释放Process资源,但要注意如果把WaitForExit()放在using块内,会变成串行执行,示例如下:for (int i = 0; i < 3; i++) { using (System.Diagnostics.Process p = new System.Diagnostics.Process()) { p.StartInfo.FileName = MyEXEPath; p.StartInfo.Arguments = $"{para1[i]} {para2[i]}"; p.Start(); p.WaitForExit(); exitCodes.Add(p.ExitCode); Console.WriteLine($"第{i+1}个进程执行完毕,返回值:{p.ExitCode}"); } }
内容的提问来源于stack exchange,提问作者DaveG
相关产品推荐
相关产品推荐

