C# 流阅读器读取结束冻结

本文关键字:读取 结束 冻结 | 更新日期: 2023-09-27 18:37:03

我有以下代码可以从 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 会无限期地冻结,我认为是因为它没有到达和结束。

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

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

谢谢。

C# 流阅读器读取结束冻结

根据MSDN:

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

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

编辑:

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

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