System.ObjectDisposedException:无法访问已关闭的Stream

时间:2012-06-26 15:41:27

标签: c# .net

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

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

3 个答案:

答案 0 :(得分:7)

因此,我将对我的评论作出回答:是的,也可以从代码外部关闭流,因此请务必检查System.ObjectDisposedException

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

答案 1 :(得分:4)

  

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

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

如果您尝试写入“已包装”的流,则会收到此错误消息。

  

使用或通过调用dispose。

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

答案 2 :(得分:2)

如果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 ......