I am using a Socket to receive data via TCP, and TextReader.ReadLine to read lines from the connection.  There is a problem where a full line has not been received -- TextReader.ReadLine returns an incomplete string.  I want it to return null, indicating that a full line could not be read.  How can I do this?
Basically, I have this data incoming:
"hello\nworld\nthis is a test\n"
When I run ReadLine I get these in return:
"hello"
"world"
"this is a te"
<null>
<socket gets more data>
"st"
<null>
I do not want "this is a te" returned. Rather, I want "this is a test" to wait until the entire line has been received.
Code:
var endPoint = ...;
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
socket.Connect(endPoint);
var stream = new NetworkStream(socket, true);
var messageBuffer = new StringBuilder();
// Data received async callback (called several times).
int bytesRead = stream.EndRead(result);
string data = Encoding.UTF8.GetString(readBuffer.Take(bytesRead).ToArray());
messageBuffer.Append(data);
using(var reader = new StringReader(messageBuffer.ToString()))
{
    // This loop does not know that Message.Read reads lines.  For all it knows, it could read bytes or words or the whole stream.
    while((Message msg = Message.Read(reader)) != null)  // See below.
    {
        Console.WriteLine(msg.ToString());    // See example input/echo above.
    }
    messageBuffer = new StringBuilder(reader.ReadToEnd());
}
// Method of Message.
public static Message Read(TextReader reader)
{
    string line = reader.ReadLine();
    if(line == null)
        return null;
    return Message.FromRawString(line);
}
Thanks.