Nein, sie wird nicht blockiert. Der Lesevorgang liest so viele Daten, wie verfügbar sind, bis zu der durch den Parameter size angegebenen Anzahl von Bytes. Quelle: http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.read.aspx
Da es nicht auf dieses zusätzliche 1 Byte wartet, sollten Sie, wenn Sie es erwarten, eine Schleife implementieren, um das Lesen des Streams fortzusetzen. Sie können die Schleife beenden, wie Sie es für richtig halten.
UPDATE: Ich habe mich geirrt, als ich sagte: "Es gibt überhaupt kein Blockieren. Wenn keine Daten zum Lesen verfügbar sind, gibt die Read-Methode 0 zurück", aber Ich hatte recht, als ich sagte, dass er nicht blockiert, wenn er darauf wartet, den gesamten Puffer zu füllen. was dem in der Frage von Kazoom beschriebenen Szenario entspricht.
Aktualisiert, um zu zeigen, dass NetworkStream.Read beim Warten auf das erste Byte blockiert, aber blockiert nicht beim Warten auf das Füllen des gesamten Puffers .
Projekte für die Konsole erstellen
Auf der einen Seite haben Sie den Hörer:
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
TcpListener listener = new TcpListener(ep);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
NetworkStream s = client.GetStream();
byte[] buffer = new byte[32];
Console.WriteLine(s.Read(buffer, 0, 32));
Console.WriteLine("Press any key to continue...");
Console.Read();
Am anderen Ende wird nur ein Byte gesendet:
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 12345);
TcpClient client = new TcpClient();
client.Connect(ep);
client.GetStream().Write(new byte[] { 60 }, 0, 1);
Console.WriteLine("Press any key to continue...");
Console.Read();
Beide Seiten werden ausgeführt, bis sie Console.Read() erreichen. Beachten Sie, dass der Listener bei Read nicht blockiert.
Der Hörer wird "1" ausgeben.