C#中如何异步读取结束进程的输出?我在C#中异步读取一个进程的输出时遇到问题。我在此站点上发现了其他一些类似的问题,但它们并没有真正帮助我。这是我所做的:创建新进程Setstartinfo-FileName,Arguments,CreateNoWindow(true),UseShellExecute(false),RedirectStandardOutput(true)将事件处理程序添加到OutputDataReceived;启动进程,BeginOutputReadLine,然后是WaitForExit()。它工作正常,但启动过程的输出是用我想要获得的某个百分比(%)写入的,但我不能,因为我的代码逐行读取并且百分比没有显示。示例:%0、%1...%100已完成。我的输出:%0完成。这是我程序的当前代码:StringBuildersBuilder=newStringBuilder();staticvoidproc_OutputDataReceived(objectsender,DataReceivedEventArgse){sBuilder.AppendLine(e.Data);}staticvoidCommandExecutor(){Processprocess=newProcess{StartInfo=newProcessStartInfo{FileName=/*程序的路径*/,Arguments=/*arguments*/,CreateNoWindow=true,UseShellExecute=false,WindowStyle=ProcessWindowStyle.Hidden,RedirectStandardOutput=true}};process.OutputDataReceived+=newDataReceivedEventHandler(proc_OutputDataReceived);过程。开始();process.BeginOutputReadLine();process.Wait}退出(读取);采用流输出有点糟糕——在进程退出之前不会读取所有数据。即使调用Process.WaitForExit(),即使随后调用Process.Close()(或Dispose()),您仍然可以获得大量数据。有关完整说明,请参阅http://alabaxblog.info/2013/06/redirectstandardoutput-beginoutputreadline-pattern-broken/,但解决方案基本上是使用同步方法。但是,为了避免死锁,您必须在另一个线程上调用其中一个:using(varprocess=Process.Start(processInfo)){//同步读取stderr(在另一个线程上)stringerrorText=null;varstderrThread=newThread(()=>{errorText=process.StandardError.ReadToEnd();});stderrThread.Start();//同步读取标准输出(在此线程上)while(true){varline=process.StandardOutput.ReadLine();如果(行==空)中断;//...用这里的行做点什么...}process.WaitForExit();stderrThread.Join();//...在这里您可以使用errorText...}Process.WaitForExit()将等待异步输出/错误流读取完成。不幸的是,Process.WaitForExit(timeout)重载不是这种情况。下面是Process类在内部所做的事情://...finally{if(processWaitHandle!=null){processWaitHandle.Close();}if(this.output!=null&&milliseconds==-1){this.output.WaitUtilEOF();}if(this.error!=null&&milliseconds==-1){this.error.WaitUtilEOF();}this.ReleaseProcessHandle(safeProcessHandle);}...所以只有在没有超时的情况下才等待异步读取!要修复它,只需在WaitForExit(timeout)返回true后调用不带参数的WaitForExit()://...if(process.WaitForExit(10*1000)&&process.WaitForExit()){//Process'sOutputDataReceived/不会再次调用ErrorDataReceived回调,达到EOF流}else{thrownewException("timeout");}有关详细信息,请阅读此处的评论:http://msdn.microsoft.com/en-us/library/ty0d8k56%28v=vs.110%29b"退格键覆盖百分比,它可能不会在每次写入后刷新到标准输出流,并且BeginOutputReadLine可能会等待在结束前为您提供数据。了解如何使用BeginRead继续阅读process.StandardOutput.BaseStream(此代码不是正确的异步代码,如果您的推送进度在表单中,则需要处理“b”):while(true){byte[]buffer=newbyte[256];varar=myProcess.StandardOutput.BaseStream.BeginRead(buffer,0,256,null,null);ar.AsyncWaitHandle.WaitOne();varbytesRead=myProcess.StandardOutput.BaseStream.EndRead(ar);如果(bytesRead>0){Console.Write(Encoding.ASCII.GetString(buffer,0,bytesRead));}else{myProcess.WaitForExit();休息;如何在process.StandardOutput上使用StreamReader,并使用Read()方法?http://msdn.microsoft.com/fr-fr/library/system.io.streamreader.read(v=vs.80).aspx以上是C#学习教程:C#中如何异步读取结束进程输出?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
