2009-02-26 5 views
26

Die Dokumentation sagt einfach Lies-Block istUnterschied zwischen StreamReader.Read und StreamReader.ReadBlock

„eine blockierende Version von Read“

aber was bedeutet das?

Noch jemand hat die Frage gestellt, aber, hm?

http://www.pcreview.co.uk/forums/thread-1385785.php

Der Mann antwortete und sprach

Grundsätzlich bedeutet dies, dass Sie auf StreamReader.ReadBlock nicht Rückkehr bis verlassen können entweder es so viel gelesen hat, wie Sie es gefragt haben, oder Es ist das Ende des Streams erreicht.

Verstehe ich richtig, dass dies erforderlich ist, weil Read nicht alles geben kann, was Sie verlangt haben? Und das, nur weil es 0 zurückgibt bedeutet das NICHT, dass Sie das Ende der Datei erreicht haben?

Also das bedeutet etwas anderes als die Anzahl der zurückgegebenen Bytes (EndOfStream?) Überprüfen oder stattdessen ReadBlock verwenden?

+0

Siehe auch [C# - Wann StreamReader.ReadBlock() zu verwenden? - Stapelüberlauf] (http://stackoverflow.com/questions/3810455/when-to-use-streamreader-readblock). – user34660

Antwort

31

ReadBlock bedeutet nicht, dass es Thread-sicher ist. Wenn Sie Reflector verwenden, um die Implementierung von StreamReader.ReadBlock (die von TextReader.ReadBlock geerbt wird) zu sehen, macht es nur mehrere Aufrufe der "Read" -Methode, bis entweder die "Read" -Methode 0 zurückgibt oder wir als gelesen haben viele Bytes wie angefordert. Dies ist erforderlich, da die "Read" -Methode nicht unbedingt so viele Bytes zurückgibt, wie Sie angefordert haben.

+0

Wenn ReadBlock nur auf Read verweist, bis Read 0 zurückgibt, was passiert, wenn Read 0 zurückgibt, aber das Ende des Streams nicht erreicht wurde? Oder ist das unmöglich? Wenn Lesen nur zurückgibt, was bereit ist, hätte ich theoretisch gedacht, dass 0 jederzeit zurückgegeben werden könnte? Oder ist das falsch? –

+1

@J M: das Zurückgeben von 0 zeigt immer an, dass das Ende des Streams erreicht wurde, also blockiert Read eigentlich auch, bis er * etwas * empfängt –

+2

Ah - das ist dann das letzte Stück. Lies die Blöcke, bis sie wenigstens etwas haben, und ReadBlock blockiert, bis es alles hat, wonach du gefragt hast, oder es hat das Ende der Datei erreicht. Wie auch immer, 0 bedeutet Ende der Datei. Das ist großartig und danke. –