Используйте класс Process
, чтобы начать новый процесс. Вы можете перенаправить стандартную ошибку и вывод - в этом случае вы, вероятно, захотите сделать это на основе событий, чтобы записать текст в приложение, когда оно выйдет из ping.
Предполагая, что вы хотите, чтобы пользователь видел вывод, как он есть, вы не хотите использовать ReadToEnd на выходе - он будет блокироваться до его завершения.
Вот полный пример, который записывает данные на консоль, но показывает, как это сделать, когда процесс записывает вывод, а не ожидает завершения процесса:
using System;
using System.Diagnostics;
class Test
{
static void Main(string[] args)
{
ProcessStartInfo psi = new ProcessStartInfo("ping")
{
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
Arguments = "google.com"
};
Process proc = Process.Start(psi);
proc.EnableRaisingEvents = true;
proc.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
proc.BeginOutputReadLine();
proc.ErrorDataReceived += (s, e) => Console.WriteLine(e.Data);
proc.BeginErrorReadLine();
proc.WaitForExit();
Console.WriteLine("Done");
}
}
Просто для примера, вот полное приложение WinForms:
using System;
using System.Drawing;
using System.Diagnostics;
using System.Windows.Forms;
class Test
{
[STAThread]
static void Main(string[] args)
{
Button button = new Button {
Text = "Click me",
Dock = DockStyle.Top
};
TextBox textBox = new TextBox {
Multiline = true,
ReadOnly = true,
Location = new Point(5, 50),
Dock = DockStyle.Fill
};
Form form = new Form {
Text = "Pinger",
Size = new Size(500, 300),
Controls = { textBox, button }
};
Action<string> appendLine = line => {
MethodInvoker invoker = () => textBox.AppendText(line + "\r\n");
textBox.BeginInvoke(invoker);
};
button.Click += delegate
{
ProcessStartInfo psi = new ProcessStartInfo("ping")
{
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardOutput = true,
Arguments = "google.com"
};
Process proc = Process.Start(psi);
proc.EnableRaisingEvents = true;
proc.OutputDataReceived += (s, e) => appendLine(e.Data);
proc.BeginOutputReadLine();
proc.ErrorDataReceived += (s, e) => appendLine(e.Data);
proc.BeginErrorReadLine();
proc.Exited += delegate { appendLine("Done"); };
};
Application.Run(form);
}
}