Пассивное чтение консоли(Win forms)
Открывается консоль с командой ping .... Через несколько секунд(При завершении) в resultText приходит нужный результат. Полный результат. Как можно сделать так, чтобы при каждом новом появлении строки переменная resultat менялась?
P.s В частности нужно для ping ... -t. Там совсем ничего не выводится по понятным причинам.
private void OpenProcces() // Открытие консоли
{
resultat = "";
PSI.RedirectStandardOutput = true;
PSI.UseShellExecute = false;
PSI.CreateNoWindow = true;
Process proc = new Process();
proc.StartInfo = PSI;
proc.Start();
var stream = proc.StandardOutput.BaseStream;
using (var reader = new StreamReader(stream, Encoding.GetEncoding(866))) // Чтение
{
resultat = reader.ReadToEnd();
Console.WriteLine(resultat);
if (InvokeRequired)
{
Invoke((MethodInvoker)(() =>
{
UpdateResultat(resultat);
}
));
}
else
UpdateResultat(resultat);
}
}
void UpdateResultat(string res) => resultText.Text = res; // Текст в потоке
private void buttonActivate_Click(object sender, EventArgs e)
{
resultText.Text = "";
for (int i = 0; i < buttonsInScene.buttons.Count; i++)
{
if (totalAction == buttonsInScene.buttons[i].name)
{
if (buttonsInScene.buttons[i].command == "cmd")
{
try
{
PSI = new ProcessStartInfo("cmd", $@"/c {buttonsInScene.buttons[i].action} {textBoxInfo.Text}"); // Создание процесса
Thread thread1 = new Thread(OpenProcces); // Создание потока
thread1.Start();
}
catch (Exception objException)
{
Console.WriteLine(objException.Message);
}
break;
}
}
}
}
Ответы (1 шт):
Автор решения: rotabor
→ Ссылка
Один из вариантов - запускать ping с параметром -n 1 (количество попыток) нужное количество раз. :-)
Вот работающий пример (который решает задачу, а не показывает образцовый код):
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Diagnostics;
namespace NsReferences {
class References {
static ProcessStartInfo PSI;
static void OpenProcces() {
PSI.RedirectStandardOutput = true;
PSI.UseShellExecute = false;
PSI.CreateNoWindow = true;
Process proc = new Process();
proc.StartInfo = PSI;
proc.Start();
var stream = proc.StandardOutput.BaseStream;
string line;
using (var reader = new StreamReader(stream, Encoding.GetEncoding(866))) {
while ((line = reader.ReadLine()) != null)
Console.WriteLine(line);
}
}
static void Main() {
try {
PSI = new ProcessStartInfo("cmd", "/c ping 192.168.1.1");
Thread thread1 = new Thread(OpenProcces);
thread1.Start();
}
catch (Exception objException) { Console.WriteLine(objException.Message); }
}
}
}
Главная загвоздка - нужно читать не весь вывод до конца, а построчно.