C# .NET Process运行死锁 直至超时终止未触发Exited退出事件
C# 调用cmd.exe进程执行命令后无法自动退出问题解决方案
问题根因
cmd.exe是交互式命令行程序,仅通过标准输入写入待执行命令时,没有显式通知其执行完后退出,cmd在命令执行完成后会持续驻留等待新的输入,不会自行终止。- Process对象默认未开启退出事件触发:
EnableRaisingEvents属性默认值为false,即使进程正常退出,也不会触发绑定的Exited事件回调。 - 写入命令后未关闭标准输入流:
RedirectStandardInput = true时,只要输入流保持打开状态,cmd.exe就会判定输入通道可用,持续等待后续输入,不会触发退出逻辑。 - 代码存在拼写错误:
Console.Writeline应为Console.WriteLine,会导致编译失败。 - 原超时逻辑中对控制台进程调用
Close()无实际作用,控制台进程无窗口消息循环,Responding属性判断不生效,无法正常终止驻留的cmd进程。
修复步骤
- 在传入的待执行命令末尾追加
& exit指令,确保无论目标命令执行成功或失败,cmd都会在命令运行结束后立即退出当前会话。 - 将Process对象的
EnableRaisingEvents属性设置为true,开启进程退出事件的触发能力。 - 写入待执行命令后,立即调用
StandardInput.Close()关闭标准输入流,切断cmd的输入等待通道。 - 修正代码中的拼写错误,移除无效的
Responding判断,超时后直接调用Kill()终止进程。 - 在
WaitForExit(超时时间)返回后,额外调用一次无参WaitForExit(),确保异步读取的标准输出、标准错误流数据全部接收完成,避免内容截断。 - 为流接收事件增加null值判断:异步流读取结束时会触发一次
Data=null的回调,过滤后避免无效null值存入消息列表。
修复后完整代码
Process cmd = new Process(); List<string> outputStreamMessages = new List<string>(); List<string> errorStreamMessages = new List<string>(); cmd.ErrorDataReceived += new DataReceivedEventHandler((sender,e) => { if(e.Data != null) errorStreamMessages.Add(e.Data); }); cmd.OutputDataReceived += new DataReceivedEventHandler((sender, e) => { if(e.Data != null) outputStreamMessages.Add(e.Data); }); cmd.Exited += new EventHandler((sender, e) => { Console.WriteLine("Exited!"); }); cmd.StartInfo = new ProcessStartInfo() { FileName = "cmd.exe", RedirectStandardInput = true, RedirectStandardOutput = true, RedirectStandardError = true, CreateNoWindow = true, UseShellExecute = false }; // 开启进程退出事件触发 cmd.EnableRaisingEvents = true; if (cmd.Start()) { // 追加& exit确保命令执行后cmd自动退出 cmd.StandardInput.WriteLine("<DUMMY CMD LINE>& exit"); // 关闭标准输入流,避免cmd持续等待输入 cmd.StandardInput.Close(); cmd.BeginOutputReadLine(); cmd.BeginErrorReadLine(); } else { throw new Exception("Cmd Line Process was unable to start"); } if (!cmd.WaitForExit(60000)) { // 超时直接强制终止进程 cmd.Kill(); // 等待终止操作完成 cmd.WaitForExit(); } // 等待所有异步流数据读取完成 cmd.WaitForExit(); // 释放进程资源 cmd.Dispose();
内容的提问来源于stack exchange,提问作者shoodaks
相关产品推荐
相关产品推荐

