我正在创建一个测试程序,该程序会将命令行工具的输出实时报告给文本框,以了解其工作原理,并学习在未来项目中使用的基础知识。我当前的代码只是将本地环回IP地址五次ping并将输出发送到文本框。最初我在“ping”期间遇到了UI锁定问题,因此我已经合并了一名后台工作人员,因此用户界面仍然保持响应状态,同时“ping”' ping'命令运行。但是我的问题是我似乎无法实时地在文本框中显示ping输出(例如,因此每个5 ping响应都出现在文本框中,就像在命令提示符中一样)。目前没有任何事情发生5秒,然后完整的' ping'结果一次显示:
这是我目前的代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
bgw.WorkerReportsProgress = true;
bgw.WorkerSupportsCancellation = true;
bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
}
//////////////////////////////////////////////////////////
// Begin ping test
//////////////////////////////////////////////////////////
private void btnPing_Click(object sender, EventArgs e)
{
if (bgw.IsBusy != true)
{
bgw.RunWorkerAsync();
}
}
//////////////////////////////////////////////////////////
// Background worker
//////////////////////////////////////////////////////////
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
Process proc = new Process();
proc.StartInfo.FileName = "ping";
proc.StartInfo.Arguments = "127.0.0.1 -n 5";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.CreateNoWindow = true;
proc.Start();
using (StreamReader reader = proc.StandardOutput)
{
string stdout = reader.ReadToEnd();
this.Invoke((MethodInvoker)delegate
{
txtOutput.AppendText(stdout);
});
}
proc.WaitForExit();
}
//////////////////////////////////////////////////////////
// Background worker completed
//////////////////////////////////////////////////////////
private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled == true)
{
btnPing.Text = "Canceled!";
}
else if (e.Error != null)
{
btnPing.Text = "Error: " + e.Error.Message;
}
else
{
btnPing.Text = "Success!";
}
}
}
我查看了类似的帖子和MSDN参考文献但是绘制了空白,因为这些技术超出了我目前的理解水平,或者似乎是无关的。可以理解正确方向的指针。