我正在尝试使用youtube-dl.exe
类从C#程序运行Process
。如果我在不重定向任何内容的情况下运行该进程,则效果很好,但是,如果我重定向标准错误或标准输出,则该进程在运行之前将有一个延迟(30到无限秒)。
基本上,当尝试重定向输出时,我可以看到该进程是在任务管理器中启动的,但其CPU使用率为0%,内存使用率为4.8MB;一段时间(最少30秒,无限期)后,程序的预期输出将记录到Visual Studio的Debug输出中,并且该过程将成功关闭。
以下是重定向输出并遇到延迟的代码:
public string Run(string arguments)
{
ProcessStartInfo processStartInfo = new ProcessStartInfo("youtube-dl.exe", arguments);
processStartInfo.RedirectStandardError = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.UseShellExecute = false;
processStartInfo.CreateNoWindow = true;
using (Process process = new Process())
{
process.StartInfo = processStartInfo;
StringBuilder sb = new StringBuilder();
process.EnableRaisingEvents = true;
process.ErrorDataReceived += (s, e) => { Debug.WriteLine($"e: {e.Data}"); sb.AppendLine(e.Data); };
process.OutputDataReceived += (s, o) => { Debug.WriteLine($"o: {o.Data}"); sb.AppendLine(o.Data); };
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
process.WaitForExit();
return sb.ToString();
}
}
我注意到,如果删除所有逻辑以重定向标准错误并输出,该程序将始终立即运行而不会出现问题:
public string Run(string arguments)
{
ProcessStartInfo processStartInfo = new ProcessStartInfo("youtube-dl.exe", arguments);
processStartInfo.UseShellExecute = false;
processStartInfo.CreateNoWindow = true;
using (Process process = new Process())
{
process.StartInfo = processStartInfo;
StringBuilder sb = new StringBuilder();
process.EnableRaisingEvents = true;
process.Start();
process.WaitForExit();
return sb.ToString();
}
}
不幸的是,由于我需要了解程序的输出,因此无法以以前的方式运行该过程。