C#streamreader readtoend冻结

时间:2016-03-02 23:05:39

标签: c# .net

我有以下代码来阅读time.nist.gov的时间:

TcpClient client = new TcpClient();
var result = client.BeginConnect("129.6.15.28", 13, null, null);
var success = result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(1)); 
if (!success || !client.Connected)
          // Timeout
else{
      streamReader = new StreamReader(client.GetStream());
      var response = streamReader.ReadToEnd();
      //code   
}

问题在于,有时ReadToEnd会被无限期冻结,我认为因为它没有到达和结束。

是否可以为此操作设置超时?

或许是更好的选择来阅读服务器响应?

感谢。

1 个答案:

答案 0 :(得分:2)

根据MSDN

  

ReadToEnd假设流知道它何时到达终点。对于服务器仅在您请求数据并且不关闭连接时才发送数据的交互式协议,ReadToEnd可能会无限期地阻塞,因为它没有达到目的,应该避免。

你知道你读了多少吗?如果是,您可以使用Read()

编辑:

我测试了这段代码(好吧,非常相似)并发现ReadToEnd工作正常,除非端口13被阻止,在这种情况下它也运行而不返回给我。因此,请在执行此操作之前检查防火墙。

Hans更好地建议使用现有的,经过良好测试的NTP库。