重定向标准输出或标准错误时,流程会有很大的初始延迟

时间:2019-04-24 22:13:47

标签: c# process youtube-dl

我正在尝试使用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();
  }
}

不幸的是,由于我需要了解程序的输出,因此无法以以前的方式运行该过程。

0 个答案:

没有答案