的NetworkStream:ReadTimeout及其影响阅读()
问题描述:
我对ReadTimeout
是如何使用的混乱,这将如何影响阅读()。的NetworkStream:ReadTimeout及其影响阅读()
当试图读取网络流,有3个场景中,假设我们正在尝试读取的字节X数:
- 数据是可用的,和字节< X
- 数据是可用的,并字节= X
- 数据是可用的,和字节> X
- 没有数据是可用的,并且
ReadTimeout
> 0 - 没有数据是可用的,和
ReadTimeout
= 0
的文档是有点含糊不清,没有明确提到在通话约ReadTimeout
到Read()
,还是ReadTimeout
影响Read()
电话都没有。
该方法将数据读入缓冲区参数并返回成功读取的字节数。如果没有数据可用于读取,则Read方法返回0. Read操作将读取尽可能多的数据,直到由size参数指定的字节数。
我的理解是上述5种情景:
-
Read()
将在X字节读取并立即返回。ReadTimeout
不要紧 -
Read()
将读取X字节,并返回 -
Read()
将读取X字节,并返回。需要再次读取读取其余的X字节。 - 电话
Read()
将等待ReadTimeout
一段时间内的数据。 -
Read()
将与0
立即返回将不胜感激,如果有人可以提供一些澄清。
谢谢。
答
如果你看看source for NetworkStream,你会发现你的场景1-4和理解是正确的(NetworkStream只是在socket上调用read())。超时超时的返回值是IOException,其中一个内部SocketException指示超时。
方案5不适用:零ReadTimeout可以不存在,或者it's减1(-1,表示无穷大)或> = 1。因此风光。 5将永远阻塞,或者在内部SocketException指示某个错误时获得IOException。
+0
谢谢冈萨雷斯!现在有道理。 – madu
'Read()'将阻塞,直到数据可用或另一方关闭连接。我认为这里的文档颇具误导性,说“如果没有数据可用于读取,则Read方法返回0”。 –
你要阅读的文档['ReadTimeout'](https://msdn.microsoft.com/en-us/library/bk6w7hs8(V = vs.110)的.aspx):在读操作的时间*“量阻止等待数据“*。'Read()'实际上会阻塞调用者,直到接收到足够的数据以复制到缓冲区。除非有错误(你得到'0'字节)或超时(你比你问的要少)。 – Sinatr
实际上'Read'会抛出超时,所以我不知道它何时会返回更少。阻止部分是[正确](https://stackoverflow.com/a/6958290/1997232)。 – Sinatr