【问题标题】:Stream.ReadLineAsync - doesn't support timeout?Stream.ReadLineAsync - 不支持超时?
【发布时间】:2018-03-08 11:57:36
【问题描述】:

我有一个网络流的实例。使用ReadLineAsync 时不会抛出超时异常。 ReadLine 没问题。为什么?

NetworkStream stream = GetStream();
stream.ReadTimeout = 1000; //1000ms
var reader = new StreamReader(stream, Encoding.UTF8, true, BufferSize, true);

所以:

await reader.ReadLineAsync(); //no timeout error

但是:

reader.ReadLine(); //timeout error.

发生了什么事?

【问题讨论】:

  • @Igor ReadLineAsync in StreamReader 不支持取消令牌。
  • 由于异步方法不接受 CancellationToken,因此无法取消操作(由于超时或任何其他原因)。您必须使用StreamReaader 的自定义实现或直接使用NetworkStream
  • 可能是这个 stackoverflow.com/questions/20131434/… 的骗子,但由于 dotnet 核心标签,我没有投我的 Mjölnir 近距离投票。
  • @pwas you don't have to use some tricky sn-p - as Igor 建议,你可以直接使用NetworkStream.ReadAsync。它应该尊重 ReadTimeout。

标签: c# .net-core networkstream


【解决方案1】:

我遇到了类似的问题。我想是的

await reader.ReadLineAsync();

相同
var ansTask = reader.ReadLineAsync();
ansTask.Wait(stream.ReadTimeout);

这意味着:启动一个异步任务,然后等待它完成一段时间。停止等待后,您继续前进,但异步任务仍会尝试完成。

如果您不满意它没有尽快完成,您可以添加如下内容:

if (!readTask.IsCompleted) throw new TimeoutException();

【讨论】:

    【解决方案2】:

    我猜ReadLineAsync 在内部会一直循环读取,直到找到 EOL,所以即使内部读取一直超时,循环也会再次尝试读取,直到它得到 EOL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多