【发布时间】:2015-12-14 11:29:06
【问题描述】:
我正在将我的进程 (proc) 的输出重定向到 Richtextbox (richTextBoxOutput)。在重定向之前,它会写入richtextbox 语句“BEFORE OUTPUT DATA”。然后它应该写入来自进程的所有数据并在之后写入句子“AFTER OUTPUT DATA”。但是,这最后一句话永远不会结束。它总是在重定向日期之间的富文本框中间的某个地方。你能帮我解决一下吗?
richTextBoxOutput.AppendText("BEFORE OUTPUT DATA");
Process proc = new Process();
proc.StartInfo.FileName = command;
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.CreateNoWindow = true;
proc.OutputDataReceived += new DataReceivedEventHandler
(
(s, e) =>
{
if (richTextBoxOutput.InvokeRequired)
{
richTextBoxOutput.Invoke(new Action(() => richTextBoxOutput.AppendText(e.Data + "\n")));
}
else
richTextBoxOutput.AppendText(e.Data + "\n");
}
);
proc.ErrorDataReceived += new DataReceivedEventHandler((s, e) => { richTextBoxOutput.AppendText(e.Data + "\n"); });
proc.Start();
proc.BeginOutputReadLine();
while (!proc.HasExited)
{
Application.DoEvents(); //Instead of proc.WaitForExit()
}
richTextBoxOutput.AppendText("AFTER OUTPUT DATA");
【问题讨论】:
-
也可以在 proc 退出后尝试
proc.CancelOutputRead();。这将完成所有正在进行的读取操作。 -
当我使用proc.CancelOutputRead()时,它可以工作,但有时它比输出快,并没有全部显示。
-
如何检查 OutputDataReceived 是否以输出结尾?
-
我建议不要使用
Application.DoEvents();它会给你带来很多麻烦。尝试在主 UI 线程之外的另一个线程中运行整个代码。那么你可以使用proc.WaitForExit或者你甚至可以使用同步读取。
标签: c# io-redirection