public AsynchronousAggregateStreamReader(StreamBuffer outputStreamBuffer, StreamBuffer errorStreamBuffer)
 {
     _outputStreamBuffer = outputStreamBuffer;
     _errorStreamBuffer = errorStreamBuffer;
 }
        private static void WireUpTheOutputOfTheReplProcessToTheTextBox(TextBox replTextBox, Process replProcess, Entity<ReplState> replEntity)
        {
            var standardOutputStream = new StreamBuffer();
            var standardErrorStream = new StreamBuffer();
            var textboxWriter = new TextBoxWriter(replTextBox, replEntity);

            var processStreamReader = new AsynchronousAggregateStreamReader(standardOutputStream, standardErrorStream);
            processStreamReader.DataReceived += textboxWriter.WriteToTextBox;

            var outputReaderThread = new Thread(processStreamReader.StartReading);
            var outputBufferStreamThread = new Thread(() => standardOutputStream.ReadStream(replProcess.StandardOutput.BaseStream));
            var errorBufferStreamThread = new Thread(() => standardOutputStream.ReadStream(replProcess.StandardError.BaseStream));

            replTextBox.Loaded +=
                (o, e) =>
                {
                    if (outputReaderThread.IsAlive) return;
                    replProcess.Start();
                    replProcess.StandardInput.AutoFlush = true;
                    outputBufferStreamThread.Start();
                    errorBufferStreamThread.Start();
                    outputReaderThread.Start();
                };

            replProcess.Exited +=
                (o, e) =>
                {
                    outputBufferStreamThread.Abort();
                    errorBufferStreamThread.Abort();
                    outputReaderThread.Abort();
                };
        }