当前位置: 首页 > 编程语言 > C#

从控制台应用程序发送输入-获取输出(C#- WinForms)分享

时间:2023-04-11 01:00:25 C#

C#学习教程:从控制台应用程序(C#/WinForms)发送输入/获取输出发送到控制台应用程序的命令,一个确认要发送的命令的按钮,以及一个显示应用程序输出的只读文本框。我想要的是用户在第一个文本框中输入命令,按下按钮进入并通过第二个文本框接收反馈。我知道如何使用ProcessStartInfo.RedirectStandardOutput,但是当我使用StandardOutput.ReadToEnd()时,应用程序挂起。我查看了异步Process.BeginOutputReadLine()但不知何故我在文本框中没有得到任何响应,即使我的应用程序没有挂起它也没有做任何事情。这是我的代码:publicpartialclassMainForm:Form{privatevoidMainForm_Load(objectsender,EventArgse){InitializeInterpreter();}privatevoidInitializeInterpreter(){InterProc.StartInfo.UseShellExecute=false;InterProc.StartInfo.FileName="app.exe";InterProc.StartInfo.RedirectStandardInput=true;InterProc.StartInfo.RedirectStandardOutput=true;InterProc.StartInfo.RedirectStandardError=true;InterProc.StartInfo.CreateNoWindow=true;InterProc.OutputDataReceived+=newDataReceivedEventHandler(InterProcOutputHandler);InterProc.Start();}privatestaticvoidInterProcOutputHandler(objectsendingProcess,DataReceivedEventArgsoutLine){if(!String.IsNullOrEmpty(outLine.Data)){OutputTextBox.Append(Environment.NewLine+outLine.Data);}}privatevoidEnterbutton_Click(objectsender,EventArgse){InterProc.StandardInput.Write(CommandtextBox.Text);InterProc.BeginOutputReadLine();}}有什么办法让我顺利运行吗?谢谢。如果你想要一些交互式的东西,我得到了这段代码(经过你的修改,修改的细节如下)InterProc.StartInfo.FileName="Echoer.exe";InterProc.StartInfo.RedirectStandardInput=true;InterProc.StartInfo.RedirectStandardOutput=true;InterProc.StartInfo.RedirectStandardError=true;InterProc.StartInfo.CreateNoWindow=true;InterProc.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;InterProc.OutputDataReceived+=newDataReceivedEventHandler(InterProcOutputHandler);boolstarted=InterProc.Start();InterProc.BeginOutputReadLine();}privatevoidAppendTextInBox(TextBoxbox,stringtext){if(this.InvokeRequired){this.Invoke((Action)AppendTextInBox,OutputTextBox,text);}else{box.Text+=text;}}privatevoidInterProcOutputHandler(objectsendingProcess,DataReceivedEventArgsoutLine){AppendTextInBox(OutputTextBox,outLine.Data+Environment.NewLine);}privatevoidEnterbutton_Click(objectsender,EventArgse){InterProc.StandardInput.WriteLine(CommandTextBox.Text);因此,我将BeginOutputReadLine移动到进程启动之后。这确保它实际上只被调用一次。我还进行了清理线程调用所需的调用。希望这对你有用。我发现的最佳解决方案是:privatevoidRedirect(StreamReaderinput,TextBoxoutput){newThread(a=>{varbuffer=newchar[1];while(input.Read(buffer,0,1)>0){output.Dispatcher.Invoke(newAction(delegate{output.Text+=newstring(buffer);}));};}).Start();}privatevoidWindow_Loaded(objectsender,RoutedEventArgse){process=newProcess{StartInfo=newProcessStartInfo{CreateNoWindow=true,FileName="app.exe",RedirectStandardError=true,RedirectStandardOutput=true,UseShellExecute=false,}};如果(process.Start()){重定向(process.StandardError,textBox1);重定向(过程。StandardOutput,textBox1);我使用过这种代码:publicstaticvoidRun(stringfileName,stringarguments,outstringstandardOutput,outstringstandardError,outintexitCode){fileProcess.StartInfo=newProcessStartInfo{FileName=fileName,Arguments=arguments,RedirectStandardError=true,RedirectStandardOutput=true,UseShellExecute=false,WindowStyle=ProcessWindowStyle.Hidden,CreateNoWindow=true,};boolstarted=fileProcess.Start();如果(开始){fileProcess.WaitForExit();}else{thrownewException("无法启动");}standardOutput=fileProcess.StandardOutput.ReadToEnd();standardError=fileProcess.StandardError.ReadToEnd();exitCode=fileProcess.ExitCode;但它不是交互式的,但如果应用程序是交互式的,那么无论如何都需要更多代码。你在哪里调用StandardOutput.ReadToEnd()?我曾经遇到过类似的问题,因为我在StandardOutput.ReadToEnd()之前调用了Process.WaitForExit()。我有很多输入,输出缓冲区在完成之前就已满,我的进程被阻塞了。您必须在Process.WaitForExit()之前调用StandardOutput.ReadToEnd()。以上就是C#学习教程的全部内容:从控制台应用程序(C#/WinForms)发送输入/获取输出。网络收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: