Асинхронно запускать процесс и отображать многострочный вывод построчно. ⇐ C#
Асинхронно запускать процесс и отображать многострочный вывод построчно.
Я запускаю команду IPerf3 асинхронно из своего приложения C# (.net6) и хочу отображать ответные сообщения в реальном времени, построчно.
Я запускаю приведенный ниже код, и он выполняет задачу должным образом, за исключением того, что вся программа появляется после завершения команды, а не во время нее.
При запуске из командной строки строка вывода появляется раз в секунду, поэтому я хотел бы добиться этого и в своей программе.
с использованием System.Diagnostics; bool Complete = ложь; число интервалов = 0; var proc = новый процесс { EnableRaisingEvents = true, StartInfo = новый ProcessStartInfo { ИмяФайла = "iperf3.exe", Аргументы = $"-c 1.2.3.4", UseShellExecute = ложь, РедиректСтандартВыход = правда, RedirectStandardError = правда, CreateNoWindow = правда, } }; proc.OutputDataReceived += (s, e) => { Console.WriteLine(e.Data); считать++; }; proc.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data); proc.Exited += (отправитель, аргументы) => { полный = правда; }; процесс.Старт(); proc.BeginOutputReadLine(); proc.BeginErrorReadLine(); процесс.WaitForExit(); проц.Dispose(); Console.WriteLine($"LineCount:{count}"); При выполнении программа выводит результат
Подключение к хосту 1.2.3.4, порт 5201 [4] локальный порт 1.2.1.1 52648 подключен к порту 1.2.3.4 5201 [ID] Интервальная пропускная способность передачи [ 4] 0,00-1,00 сек 81,8 МБ 685 Мбит/сек [ 4] 1,00-2,00 сек 88,2 МБ 739 Мбит/сек [ 4] 2,00-3,00 сек 89,5 МБ 752 Мбит/сек [ 4] 3,00-4,00 с 90,0 МБ 755 Мбит/с [ 4] 4,00-5,00 с 89,1 МБ 748 Мбит/с [ 4] 5,00-6,00 с 90,0 МБ 754 Мбит/с [ 4] 6,00-7,00 сек 89,4 МБ 750 Мбит/сек [ 4] 7,00-8,00 сек 85,5 МБ 717 Мбит/сек [ 4] 8.00-9.00 сек 88,4 МБ 742 Мбит/сек [ 4] 9.00-10.00 сек 89,9 МБ 754 Мбит/сек - - - - - - - - - - - - - - - - - - - - - - - - - [ID] Интервальная пропускная способность передачи [ 4] 0.00-10.00 сек 882 МБ 740 Мбит/с отправитель [ 4] 0,00-10,00 сек. Приемник 882 МБ, 740 Мбит/с. iperf Готово. Количество линий: 20 Значение счетчика 20 означает, что выходные данные команды определенно принимаются построчно, поэтому проблем, связанных с обработкой CR/LF, нет.
Обработчик OutputDataReceived не вызывается примерно через 10 секунд после завершения команды. Я бы хотел, чтобы OutputDataReceived вызывался раз в секунду во время выполнения команды.
Я запускаю команду IPerf3 асинхронно из своего приложения C# (.net6) и хочу отображать ответные сообщения в реальном времени, построчно.
Я запускаю приведенный ниже код, и он выполняет задачу должным образом, за исключением того, что вся программа появляется после завершения команды, а не во время нее.
При запуске из командной строки строка вывода появляется раз в секунду, поэтому я хотел бы добиться этого и в своей программе.
с использованием System.Diagnostics; bool Complete = ложь; число интервалов = 0; var proc = новый процесс { EnableRaisingEvents = true, StartInfo = новый ProcessStartInfo { ИмяФайла = "iperf3.exe", Аргументы = $"-c 1.2.3.4", UseShellExecute = ложь, РедиректСтандартВыход = правда, RedirectStandardError = правда, CreateNoWindow = правда, } }; proc.OutputDataReceived += (s, e) => { Console.WriteLine(e.Data); считать++; }; proc.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data); proc.Exited += (отправитель, аргументы) => { полный = правда; }; процесс.Старт(); proc.BeginOutputReadLine(); proc.BeginErrorReadLine(); процесс.WaitForExit(); проц.Dispose(); Console.WriteLine($"LineCount:{count}"); При выполнении программа выводит результат
Подключение к хосту 1.2.3.4, порт 5201 [4] локальный порт 1.2.1.1 52648 подключен к порту 1.2.3.4 5201 [ID] Интервальная пропускная способность передачи [ 4] 0,00-1,00 сек 81,8 МБ 685 Мбит/сек [ 4] 1,00-2,00 сек 88,2 МБ 739 Мбит/сек [ 4] 2,00-3,00 сек 89,5 МБ 752 Мбит/сек [ 4] 3,00-4,00 с 90,0 МБ 755 Мбит/с [ 4] 4,00-5,00 с 89,1 МБ 748 Мбит/с [ 4] 5,00-6,00 с 90,0 МБ 754 Мбит/с [ 4] 6,00-7,00 сек 89,4 МБ 750 Мбит/сек [ 4] 7,00-8,00 сек 85,5 МБ 717 Мбит/сек [ 4] 8.00-9.00 сек 88,4 МБ 742 Мбит/сек [ 4] 9.00-10.00 сек 89,9 МБ 754 Мбит/сек - - - - - - - - - - - - - - - - - - - - - - - - - [ID] Интервальная пропускная способность передачи [ 4] 0.00-10.00 сек 882 МБ 740 Мбит/с отправитель [ 4] 0,00-10,00 сек. Приемник 882 МБ, 740 Мбит/с. iperf Готово. Количество линий: 20 Значение счетчика 20 означает, что выходные данные команды определенно принимаются построчно, поэтому проблем, связанных с обработкой CR/LF, нет.
Обработчик OutputDataReceived не вызывается примерно через 10 секунд после завершения команды. Я бы хотел, чтобы OutputDataReceived вызывался раз в секунду во время выполнения команды.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Есть ли способ запускать запросы SQLite из Python асинхронно или параллельно?
Anonymous » » в форуме Python - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-