Process.Start 卡死问题解决

发布时间 2023-10-12 12:02:19作者: 空明流光

首先声明是GPT的功劳

代码如下:

var p = Process.Start(exe, arg);
p.WaitForExit();

现象:调度显示在第一句卡死,压根没走到第二句

GPT分析原因:对于进程启动后卡死的情况,一种可能的原因是标准输出缓冲区已满,导致进程被阻塞无法继续执行。为了解决这个问题,可以添加一个异步读取标准输出的逻辑,确保标准输出能够及时被处理。

修复代码如下:

ProcessStartInfo startInfo = new ProcessStartInfo("cmd.exe", arguments);
startInfo.RedirectStandardOutput = true; // 启用标准输出重定向
startInfo.UseShellExecute = false; // 禁用操作系统外壳程序

Process process = new Process();
process.StartInfo = startInfo;
process.OutputDataReceived += (sender, e) =>
{
    if (!string.IsNullOrEmpty(e.Data)) // 处理非空输出
    {
        Console.WriteLine(e.Data); // 示例:将输出打印到控制台
    }
};
process.EnableRaisingEvents = true; // 允许捕获退出事件
process.Start();

process.BeginOutputReadLine(); // 异步开始读取标准输出

process.WaitForExit(); // 等待进程执行完成

在修复代码中,我们使用 RedirectStandardOutput 属性启用了标准输出重定向,并在进程启动前添加了对 OutputDataReceived 事件的订阅。通过调用 BeginOutputReadLine() 方法,我们异步开始读取标准输出,确保标准输出能够及时被处理。同时,设置 EnableRaisingEvents 属性为 true,允许捕获进程退出事件。最后,调用 WaitForExit() 方法等待进程执行完成。这样修复后的代码应该能够避免卡死的问题。