在处理流之前取消了读取,但仍然抛出异常

时间:2017-12-18 01:02:29

标签: c# objectdisposedexception cancellation-token

我目前正在收到一个' ObjectDisposed'例外,我不知道如何解决它。我确定在开始读取操作之前检查流是否未关闭:

token.ThrowIfCancellationRequested();
int amount = await stream.ReadAsync(buffer, offset, buffer.Length - offset, token);

关闭流之前,我取消了任何待处理的读取:

tokenSource.Cancel();
stream.Close();

但是,我仍然得到以下例外:

  

无法访问已处置的对象。   对象名称:' System.Net.Sockets.NetworkStream'。

这是虚假的,所以它似乎是一种竞争条件,但它经常发生,足以让我重现它。似乎有三种可能性:

  • CancellationTokenSource不是原子的(快速谷歌没有回答这个问题)
  • NetworkStream提供的优先级高于被取消
  • 我失踪的其他原因

如何更优雅地处理这个问题?请记住我目前正在使用的以下限制:

  • 该流正在一个长期存在的包装类中使用,该类可能不在using块中
  • 该流来自NetworkStream
  • 包裹的套接字
  • 取消令牌由链接的令牌来源
  • 制作

0 个答案:

没有答案