Процесс имеет значительную начальную задержку при перенаправлении стандартного вывода или стандартной ошибки - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь запустить youtube-dl.exe из моей программы на C #, используя класс Process.Если я запускаю процесс без перенаправления чего-либо, он отлично работает, но если я перенаправляю стандартную ошибку или стандартный вывод, то процесс будет иметь задержку (от 30 до бесконечных секунд), прежде чем он запустится.

По существу, при попытке перенаправитьвывод, я вижу, что процесс запускается в диспетчере задач, но он остается на 0% процессора и 4,8 МБ памяти;через некоторое время (всего 30 секунд и бесконечно долго) ожидаемый вывод программы будет записан в вывод отладки Visual Studio, и процесс будет успешно завершен.

Вот код, который перенаправляет вывод ииспытывает задержку:

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();
  }
}

К сожалению, яне могу запустить процесс предыдущим способом, потому что мне нужно знать вывод программы.

...