【问题标题】:System.ObjectDisposedException: Cannot access a closed StreamSystem.ObjectDisposedException:无法访问已关闭的流
【发布时间】:2012-06-26 15:41:26
【问题描述】:

这是真的吗,这并不一定意味着流已被代码处理 - 无论是在使用中还是通过调用 dispose。

流可能已在此代码之外关闭,但仍会发生此异常?

【问题讨论】:

  • @PhilipDaubmeier - 您应该在其他人之前将其扩展为答案。这是一个可能不会被关闭的有效问题,它需要一个答案。你是第一个。记住,伙计!
  • 如果您向我们展示代码,我们或许能够指出您问题的根源...
  • 某物或某人称为 Close() 或 Dispose()。您对“内部”和“外部”代码的定义是什么?这有什么关系?

标签: c# .net


【解决方案1】:

如果 requestLengthDiskThreshold 小于您尝试通过流上传/处理的文件的大小,也会发生此错误。这是在您的 web.config 中定义的:

<httpRuntime maxRequestLength="512000" requestLengthDiskThreshold="512000" />

如果你看这里对第二个参数的解释:

https://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.requestlengthdiskthreshold(v=vs.110).aspx

您将看到它设置了输入流缓冲阈值(以千字节为单位)。默认值为 80KB,因此如果您没有设置此值并且您尝试使用 ajax 上传大于 80KB 的文件,您将收到 System.ObjectDisposedException 异常,因为一旦达到阈值限制,流将被关闭.

在我的情况下,我将阈值设置为 500MB...

【讨论】:

  • 我有这个错误并将requestLengthDiskThreshold 更改为与maxRequestLength 相同的问题,但似乎不需要这样做?据我了解,requestLengthDiskThreshold 只是文件在缓冲到磁盘之前的最大大小,但缓冲应该是透明的。 .NET 不应该对我们隐藏它吗,从代码的角度来看,这不仅仅是一个流,我们的代码并不关心它是流式传输到磁盘还是内存,并且该要求可能会随着时间而改变......
  • ... 数十个客户端都使用 500MB 的 RAM(就像我们系统中的情况一样)可能会导致 IIS 很快耗尽 RAM。只是要明确一点,并不是说您的答案是错误的,只是这里的框架中似乎有些地方不太正确。
【解决方案2】:

流可能已在此代码之外关闭,但仍会发生此异常?

是的。例如 - 如果您将一个流包装在另一个流中,并处置“包装器”流,就会发生这种情况。许多实现会处理它们包装的流。

如果您随后尝试写入“包装”流,您将收到此错误消息。

在使用中或通过调用 dispose。

还要意识到,对于具有Close() 方法的对象,例如StreamCloseDispose,通常执行相同的功能。关闭流也会释放它。

【讨论】:

    【解决方案3】:

    所以我的评论是一个答案:是的,流也可以从您的代码外部关闭,因此请确保您检查System.ObjectDisposedException

    有几种情况可能会发生这种情况:例如,想象一个与网络连接相关联的流并且连接突然中断。根据实现,这可能会关闭流并在访问流时抛出该特定异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2011-01-20
      • 2011-12-27
      • 2012-06-11
      • 2021-12-21
      • 2017-01-12
      • 2021-08-30
      相关资源
      最近更新 更多