J'ai une confusion sur la façon dont le ReadTimeout
est utilisé et comment cela affecte Read().NetworkStream: ReadTimeout et son effet Read()
Lorsque vous essayez de lire le flux de réseau, il y a 3 scénarios, en supposant que nous essayons de lire un nombre X d'octets:
- Les données sont disponibles, et d'octets de données < X
- est disponible, et octets = X
- Les données sont disponibles, et d'octets> X
- Aucune donnée disponible et
ReadTimeout
> 0 - Aucune donnée disponible, et
ReadTimeout
= 0
La documentation est un peu ambigu et ne mentionne pas explicitement de ReadTimeout
dans l'appel à Read()
, ou si ReadTimeout
affecte Read()
appel à tous.
Cette méthode lit les données dans le paramètre buffer et renvoie le nombre d'octets lus avec succès. Si aucune donnée n'est disponible pour la lecture, la méthode Read renvoie 0. L'opération Read lit autant de données que possible, jusqu'au nombre d'octets spécifié par le paramètre size.
Ce que je comprends est pour les 5 scénarios ci-dessus:
Read()
lira en octets X et revenir immédiatement.ReadTimeout
n'a pas d'importanceRead()
lira X octets et retourRead()
lira X octets et retour. Besoin d'appeler relire pour lire le reste des X octets.- L'appel à
Read()
va attendreReadTimeout
période de temps pour les données. Read()
retournera immédiatement à 0.
vous serions reconnaissants si quelqu'un peut donner des éclaircissements.
Merci.
'Read()' se bloque jusqu'à ce que des données soient disponibles ou que l'autre côté ferme la connexion. Je pense que la documentation est assez trompeuse en disant "si aucune donnée n'est disponible pour la lecture, la méthode Read retourne 0". –
Vous devez lire la documentation de ['ReadTimeout'] (https://msdn.microsoft.com/en-us/library/bk6w7hs8 (v = vs.110) .aspx): *" durée d'une opération de lecture blocs en attente de données "*.'Read()' bloquera l'appelant jusqu'à ce que suffisamment de données soient reçues pour être copiées dans le tampon. À moins qu'il y ait une erreur (vous obtenez '0' octets) ou le délai d'attente (vous obtenez moins que vous avez demandé). – Sinatr
En fait 'Read' lancera le timeout, donc je ne sais pas quand il retournera moins. La partie bloquante est [correcte] (https://stackoverflow.com/a/6958290/1997232). – Sinatr