首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Streamreader.Read块/ RedirectStandardOutput

Streamreader.Read块/ RedirectStandardOutput
EN

Stack Overflow用户
提问于 2012-05-31 18:23:30
回答 3查看 1.8K关注 0票数 2

我试图使用StreamReader从进程读取输出数据,但是StreamReader会阻塞并且不会返回任何输出。

我的流程如下:

代码语言:javascript
复制
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.Arguments = args;
startInfo.FileName = filename;
StartInfo.WorkingDirectory = aDirectory;
StartInfo.UseShellExecute = false;
StartInfo.RedirectStandardOutput = true;
Process p = new Process();
p.StartInfo = startInfo;
p.Start();

StreamReader随后就被调用了:

代码语言:javascript
复制
StreamReader strmRead = p.StandardOutput;
char[] output = new char[4096];
while(true){
   strmRead.Read(output,0,output.Length);
   string outputString = new string(output);
   Debug.WriteLine(outputString);
}

代码挂起对Read方法的调用。当我手动终止程序时,进程的输出将被写入调试控制台。流程输出不使用换行符,因此使用Process.OutputDataReceived不起作用。如何在不无限期阻塞的情况下从流中获取流程输出?

编辑:给出了我已经得到的答案,这个过程没有放弃标准输出,或者没有刷新输出,这似乎是一个问题,而不是我的代码有什么问题。如果其他人有任何洞察力,可以随意评论。

EN

回答 3

Stack Overflow用户

发布于 2012-05-31 18:28:46

您正在读取4096字节,并且可能会有更少的流块。

此外,还有更有效的方法从流中读取文本。TextReaderReadLine方法,试一试。

http://msdn.microsoft.com/en-us/library/system.io.textreader.readline.aspx

顺便说一句,while (true)?你打算怎么退出?

票数 1
EN

Stack Overflow用户

发布于 2012-05-31 18:32:01

你可以这么做:

代码语言:javascript
复制
String outputString = strmRead.ReadToEnd();
票数 1
EN

Stack Overflow用户

发布于 2014-07-27 09:50:53

我知道这个问题很老。但我也有类似的问题。我尝试使用Peek()方法,但是即使当Peek()返回-1时,它也并不总是流的末尾。

我通过启动一个新线程来解决我的问题,该线程试图在Peek()返回-1时读取下一个字符。

代码语言:javascript
复制
                    string toRead = "";
                    do
                    {
                        if (reader.Peek() == -1)
                        {
                            Thread td = new Thread(TryReading);
                            td.Start();
                            Thread.Sleep(400);
                            if (ReadSuccess == false)
                            {
                                try
                                {
                                    td.Abort();
                                }
                                catch (Exception ex) { }
                                break;
                            }
                            else
                            {
                                toRead += ReadChar;
                                ReadSuccess = false;
                            } 
                        }
                        toRead += (char)reader.Read();
                    } while (true);

TryReading()方法在这里定义:

代码语言:javascript
复制
static char ReadChar = 'a';
static bool ReadSuccess = false;

static void TryReading(object callback)
{
    int read = reader.Read();
    ReadChar = (char)read;
    ReadSuccess = true;
}

基本上..。如果线程花了很长时间才读到字符--我中止了它,并使用它读取的文本到目前为止。

这解决了我的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10839106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档