2009-02-26 12 views
26

La documentazione dice semplicemente ReadBlock èDifferenza tra StreamReader.Read e StreamReader.ReadBlock

"una versione di blocco Leggi"

ma cosa vuol dire?

Qualcun altro ha già fatto la domanda ma, eh?

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

La segreteria ragazzo ha detto

In pratica, ciò significa che si può contare su StreamReader.ReadBlock non tornare fino a quando è letta tanto come avete chiesto a, o è arrivato alla fine del flusso.

Sto capendo correttamente che questo è necessario perché Leggi potrebbe non darti tutto ciò che hai richiesto? E questo solo perché restituisce 0 NON significa che hai raggiunto la fine del file?

Quindi, questo significa controllare qualcosa di diverso dal numero di byte restituiti (EndOfStream?) O utilizzare invece ReadBlock?

+0

Vedere anche [C# - Quando utilizzare StreamReader.ReadBlock()? - Stack Overflow] (http://stackoverflow.com/questions/3810455/when-to-use-streamreader-readblock). – user34660

risposta

31

ReadBlock non significa che è thread-safe. Se si utilizza Reflector per esaminare l'implementazione di StreamReader.ReadBlock (che è ereditato da TextReader.ReadBlock), tutto ciò che fa è effettuare più chiamate al metodo "Read" finché il metodo "Read" non restituisce 0 o si legge come molti byte come richiesto. Questo è necessario perché il metodo "Read" non restituirà necessariamente tanti byte quanti ne hai richiesto.

+0

Se ReadBlock si limita a leggere Read finché Read non restituisce 0, cosa succede se Read restituisce 0 ma non è stata raggiunta la fine del flusso? O è impossibile? Se Read restituisce solo ciò che è pronto, avrei pensato che fosse teoricamente possibile che 0 potesse essere restituito in qualsiasi momento? O è sbagliato? –

+1

@ J M: restituendo 0 indica sempre che è stata raggiunta la fine del flusso, quindi Read è in realtà anche bloccante finché non riceve * qualcosa * –

+2

Ah - questo è il pezzo finale quindi. Leggi i blocchi fino a quando non ha almeno qualcosa e blocchi ReadBlock fino a quando non ha tutto ciò che hai chiesto o ha colpito la fine del file. Ad ogni modo, 0 significa fine del file. È fantastico e grazie. –