title: Partially read standard output of another process created from c# application
body: <p>I have a GUI application within which i'm spawning a console application using Process class.</p>
  
  <pre><code>Process p1 = new Process();
  p1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
  p1.StartInfo.CreateNoWindow = true;
  p1.StartInfo.UseShellExecute = false;
  p1.StartInfo.FileName = Path.Combine(basepath, "abc.exe");
  p1.StartInfo.Arguments = "/pn abc.exe /f \"temp1.txt\"";
  p1.StartInfo.RedirectStandardError = true;
  p1.StartInfo.RedirectStandardInput = true;
  p1.StartInfo.RedirectStandardOutput = true;
  p1.OutputDataReceived += new DataReceivedEventHandler(outputreceived);
  p1.ErrorDataReceived += new DataReceivedEventHandler(errorreceived);
  p1.Start();
  tocmd = p1.StandardInput;
  p1.BeginOutputReadLine();
  p1.BeginErrorReadLine();
  </code></pre>
  
  <p>Now i have a problem that, though it reads the console output asynchronously but it seems to fire the event only when the internal buffer is filled with some amount. I want it to display data as it comes. If there's 10 bytes in buffer, let it display the 10 bytes. My program implements sleep() call internally, so i need to print the data till it goes to sleep.</p>
  
  <p>How can i do it?</p>
  
  <p>=============</p>
  
  <p>As it was mentioned the output is line buffered, i tried the following change in the code</p>
  
  <pre><code>p1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
  p1.StartInfo.CreateNoWindow = true;
  p1.StartInfo.UseShellExecute = false;
  p1.StartInfo.FileName = Path.Combine(basepath, "abc.exe");
  p1.StartInfo.Arguments = pnswitch + " /f \"temp1.txt\"";
  p1.StartInfo.RedirectStandardError = false;
  p1.StartInfo.RedirectStandardInput = true;
  p1.StartInfo.RedirectStandardOutput = true;
  p1.Start();
  tocmd = p1.StandardInput;
  MethodInvoker mi = new MethodInvoker(readout);
  mi.BeginInvoke(null, p1);
  </code></pre>
  
  <p>and inside readout i wrote</p>
  
  <pre><code>void readout()
      {
          string str;
          while ((str = p1.StandardOutput.ReadLine()) != null)
          {
              richTextBox1.Invoke(new UpdateOutputCallback(this.updateoutput), new object[] { str });
              p1.StandardOutput.BaseStream.Flush();
          }
      }
  </code></pre>
  
  <p>So i think it now monitors when each line is written and it prints it right? this too didn't work. Any thing wrong there?</p>