RedirectStandardOutput - это буферизация строк, а не мгновенная?
-
04-07-2019 - |
Вопрос
Хорошо, я пытаюсь использовать Tail для мониторинга файла журнала, но я не могу получить такое же программное поведение, как при ручном запуске его через приглашение cmd с теми же параметрами.
При запуске через приглашение cmd отображаются новые строки мгновенно . Однако с программной точки зрения мне придется подождать около 75+ новых строк в файле журнала, прежде чем «буфер» освободит все строки.
Вот код, который у меня есть сейчас.
private const string tailExecutable = @"C:\tail.exe";
private const string logFile = @"C:\test.log";
private static void ReadStdOut()
{
var psi = new ProcessStartInfo
{
FileName = tailExecutable,
Arguments = String.Format("-f \"{0}\"", logFile),
UseShellExecute = false,
RedirectStandardOutput = true
};
// Running same exe -args through cmd.exe
// works perfectly, but not programmatically.
Console.WriteLine("{0} {1}", psi.FileName, psi.Arguments);
var tail = new Process();
tail.StartInfo = psi;
tail.OutputDataReceived += tail_OutputDataReceived;
tail.Start();
tail.BeginOutputReadLine();
}
static void tail_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(e.Data);
}
Я уже использовал событие OutputDataReceived, но у меня никогда не было таких проблем с буферизацией / рассылкой спама. Р>
Я так запутался с этим сейчас.
* Изменить *
Я нашел этот проект wintail в CodeProject и собираюсь переключиться к этому, потому что буфер делает это решение слишком медленным.
Спасибо за ответы.
Решение
Process.StandardOutput при перенаправлении по умолчанию использует StreamReader с 4096-байтовым буфером, поэтому ответ - да.
Другие советы
В большинстве языков и операционных систем стандартный поток обычно буферизуется, а поток ошибок - нет.
Попробуйте использовать: <Код> System.Console.Error Код>