如何将流程输出(控制台)重定向到richtextbox?有什么问题,为什么richtextbox没有得到Process输出流?在richtextbox中没有显示文本..privatevoidbutton1_Click(objectsender,EventArgse){ProcesssortProcess;sortProcess=newProcess();sortProcess.StartInfo.FileName="sort.exe";sortProcess.StartInfo.Arguments=this.comboBox1.SelectedItem.ToString();//将UseShellExecute设置为false以进行重定向。sortProcess.StartInfo.CreateNoWindow=true;sortProcess.StartInfo.UseShellExecute=false;//重定向排序命令的标准输出。//使用事件处理程序异步读取此流。排序过程。开始信息。RedirectStandardOutput=true;sortOutput=newStringBuilder("");输入也是如此。这个流//是同步使用的。排序过程。开始信息。重定向标准输入放=真;//启动进程。排序过程。开始();//开始异步读取排序输出流。排序过程。BeginOutputReadLine();排序过程。等待退出();富文本框1。AppendText(sortOutput.ToString());}privatestaticvoidSortOutputHandler(objectsendingProcess,DataReceivedEventArgsoutLine){sortOutput.Append(Environment.NewLine+"["+numOutputLines.ToString()+"]-"+outLine.Data);所以当sort.exe启动时,它显示文本,我希望所有这些文本也显示在RealTime的richtextbox中(我不想等待进程退出,然后读取所有输出)我怎样才能做到这一点?我的代码中有错误的部分吗?感谢@botz的更新我在我的代码中添加了这个privatevoidSortOutputHandler(objectsendingProcess,DataReceivedEventArgsoutLine){sortOutput.Append(Environment.NewLine+"["+numOutputLines.ToString()+"]-"+outLine.Data);richTextBox1.AppendText(sortOutput.ToString());但它抛出此异常跨线程操作无效:从创建它的线程以外的线程访问的控件“richTextBox1”。WaitForExit()会阻塞您的UI线程,因此您看不到新的输出要么在单独的线程中等待进程,要么将WaitForExit()替换为如下内容:while(!sortProcess.HasExited){Application.DoEvents();//这使您的表单通过处理事件保持响应}在SortOutputHandler中,您现在可以将输出直接附加到文本框。但是你应该记得检查是否需要在UI线程上调用它。您可以在处理程序中以这种方式检查它是否在UI线程中:}else{排序输出。Append(Environment.NewLine+"["+numOutputLines.ToString()+"]-"+outLine.Data);richTextBox1.AppendText(sortOutput.ToString());这对我有用:sortProcess.StartInfo.CreateNoWindow=true;sortProcess.StartInfo.UseShellExecute=false;sortProcess.StartInfo.RedirectStandardOutput=true;//设置事件处理程序sortProcess.OutputDataReceived+=newDataReceivedEventHandler(SortOutputHandler);//启动进程。sortProcess.Start();//开始异步读取sortProcess.BeginOutputReadLine();sortProcess.WaitForExit}}voidSortOutputHandler(objectsender,DataReceivedEventArgse){Trace.WriteLine(e.Data);this.BeginInvoke(newMethodInvoker(()=>{richTextBox1.AppendText(e.Data??string.Empty);}));您开始的示例是一个控制台应用程序,它不关心多线程访问对于Windows窗体,当您更新控件时,它必须从主UI线程完成,这就是需要BeginInvoke的原因。如果您想快速检查SortOutputHandler类的处理程序是否正常工作,您可以使用System.Diagnostics.Trace.Write*,它不需要BeginInvoke。编辑:echo_hello.bat简单地回显“hello”字符串:@echooffechohello如果您从另一个线程更新用户界面,您需要确保您在主用户界面线程上。检查方法中的InvokeRequired。请参阅InvokeRequired完整的应用程序和源代码可从codeproject的外部链接获得:http://www.codeproject.com/Articles/335909/Embedding-a-Console-in-aC-Application这是https://github的实现教程.com/dwmkerr/consolecontrol。以上就是C#学习教程:Howtoredirecttheprocessoutput(console)torichtextbox?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
