在我的表单中,我通过运行可执行文件loader.exe
(visual studio中的另一个项目)开始操作,该文件随着时间的推移在控制台上打印一些信息,直到它终止。我想做的是:
我想在继续执行时读取控制台,并在表单应用程序的文本框textBoxConsole1
中显示最新输出(带有一些额外信息的百分比),以便用户可以了解进度。
loader.exe
不一样。
在这个帖子中 C# Show output of Process in real time
Mr.Passant说:
"这很正常,当您重定向其输出时,该过程将切换到缓冲输出。如果它没有吐出很多文本,那么该缓冲区不会填充足够以使其被刷新。如果你无法修复程序的代码,那么你无能为力。"
这个"足够多"究竟?我的代码:
private void buttonConnect_Click(object sender, EventArgs e)
{
Thread findThread = new Thread(findProcedure);
findThread.Start();
}
public void findProcedure()
{
Process process = new Process();
process.StartInfo.FileName = PATH;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.CreateNoWindow = true;
process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
{
if (!String.IsNullOrEmpty(e.Data))
{
//textBoxConsole1.Text = e.Data; //Cross-thread validation exception
//use thread safe set method instead
setConsole1(e.Data);
}
});
process.ErrorDataReceived += new DataReceivedEventHandler((sender, e) =>
{
if (!String.IsNullOrEmpty(e.Data))
{
setConsole3(e.Data);
}
});
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
}
我的线程安全设置方法:
public void setConsole1(string str)
{
if (this.textBoxConsole1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(setConsole1);
this.Invoke(d, new object[] { str });
}
else
{
textBoxConsole1.AppendText(str);
textBoxConsole1.AppendText(Environment.NewLine);
}
}
错误数据处理程序方法setConsole3
与setConsole1
相同,但设置为另一个框。
答案 0 :(得分:0)
您应该在StartInfo中将RedirectStandardOutput设置为true。
Process process = new Process();
try
{
process.StartInfo.FileName = fileName // Loader.exe in this case;
...
//other startInfo props
...
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += OutputReceivedHandler //OR (sender, e) => Console.WriteLine(e.Data);
process.ErrorDataReceived += ErrorReceivedHandler;
process.Start();
process.BeginOutputReadline();
process.BeginErrorReadLine();
....
//other thing such as wait for exit
}