Я пытаюсь запустить 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();
}
}
К сожалению, яне могу запустить процесс предыдущим способом, потому что мне нужно знать вывод программы.