2017-10-13 44 views
1

我对ReadTimeout是如何使用的混乱,这将如何影响阅读()。的NetworkStream:ReadTimeout及其影响阅读()

当试图读取网络流,有3个场景中,假设我们正在尝试读取的字节X数:

  1. 数据是可用的,和字节< X
  2. 数据是可用的,并字节= X
  3. 数据是可用的,和字节> X
  4. 没有数据是可用的,并且ReadTimeout> 0
  5. 没有数据是可用的,和ReadTimeout = 0

的文档是有点含糊不清,没有明确提到在通话约ReadTimeoutRead(),还是ReadTimeout影响Read()电话都没有。

该方法将数据读入缓冲区参数并返回成功读取的字节数。如果没有数据可用于读取,则Read方法返回0. Read操作将读取尽可能多的数据,直到由size参数指定的字节数。

我的理解是上述5种情景:

  1. Read()将在X字节读取并立即返回。 ReadTimeout不要紧
  2. Read()将读取X字节,并返回
  3. Read()将读取X字节,并返回。需要再次读取读取其余的X字节。
  4. 电话Read()将等待ReadTimeout一段时间内的数据。
  5. Read()将与0

立即返回将不胜感激,如果有人可以提供一些澄清。

谢谢。

+1

'Read()'将阻塞,直到数据可用或另一方关闭连接。我认为这里的文档颇具误导性,说“如果没有数据可用于读取,则Read方法返回0”。 –

+2

你要阅读的文档['ReadTimeout'](https://msdn.microsoft.com/en-us/library/bk6w7hs8(V = vs.110)的.aspx):在读操作的时间*“量阻止等待数据“*。'Read()'实际上会阻塞调用者,直到接收到足够的数据以复制到缓冲区。除非有错误(你得到'0'字节)或超时(你比你问的要少)。 – Sinatr

+2

实际上'Read'会抛出超时,所以我不知道它何时会返回更少。阻止部分是[正确](https://stackoverflow.com/a/6958290/1997232)。 – Sinatr

回答

1

如果你看看source for NetworkStream,你会发现你的场景1-4和理解是正确的(NetworkStream只是在socket上调用read())。超时超时的返回值是IOException,其中一个内部SocketException指示超时。

方案5不适用:零ReadTimeout可以不存在,或者it's减1(-1,表示无穷大)或> = 1。因此风光。 5将永远阻塞,或者在内部SocketException指示某个错误时获得IOException。

+0

谢谢冈萨雷斯!现在有道理。 – madu