C# System.ObjectDisposedException:无法访问封闭流
这是否真的不一定意味着流已经被代码处理掉了——无论是在使用中还是通过调用dispose 该流可能已在此代码之外关闭,但此异常仍会发生 该流可能已在此代码之外关闭,但此异常仍会发生 对。例如,如果在另一个流中包装一个流,并处理“包装器”流,则可能会发生这种情况。许多实现都会处理它们正在包装的流 如果您随后尝试写入“包装”流,您将收到此错误消息 在使用或通过调用disposeC# System.ObjectDisposedException:无法访问封闭流,c#,.net,C#,.net,这是否真的不一定意味着流已经被代码处理掉了——无论是在使用中还是通过调用dispose 该流可能已在此代码之外关闭,但此异常仍会发生 该流可能已在此代码之外关闭,但此异常仍会发生 对。例如,如果在另一个流中包装一个流,并处理“包装器”流,则可能会发生这种情况。许多实现都会处理它们正在包装的流 如果您随后尝试写入“包装”流,您将收到此错误消息 在使用或通过调用dispose 还要认识到,对于具有Close()方法的对象,例如Stream,Close和Dispose通常执行相同的功能。关闭一个流也会
还要认识到,对于具有
Close()
方法的对象,例如Stream
,Close
和Dispose
通常执行相同的功能。关闭一个流也会处理它。所以我将我的评论作为一个答案:是的,一个流也可以从代码外部关闭,所以请确保检查系统。ObjectDisposedException
有几种情况可能发生这种情况:例如,想象一个与网络连接相关联的流,连接突然中断。根据实现情况,如果访问流,这可能会关闭流并引发特定异常。如果requestLengthDiskThreshold小于您试图通过流上载/处理的文件的大小,也可能发生此错误。这在web.config中定义:
<httpRuntime maxRequestLength="512000" requestLengthDiskThreshold="512000" />
如果您在此处查看第二个参数的说明:
您将看到它设置了输入流缓冲阈值(以KB为单位)。默认值为80KB,因此,如果未设置此值,并且尝试(例如)通过ajax上载大于80KB的文件,则会出现System.ObjectDisposedException异常,因为一旦满足阈值限制,流将关闭
在我的例子中,我将阈值设置为500MB…@PhilipDaubmeier-你应该在其他人之前将其扩展到一个答案。这是一个很可能无法解决的有效问题,它需要一个答案。你是第一个。拿功劳吧,伙计!如果您向我们展示代码,我们可能会向您指出问题的根源……某个名为Close()或Dispose()的人或物。您对“内部”和“外部”代码的定义是什么?这又有什么关系呢?我犯了这个错误,将
requestLengthDiskThreshold
更改为与maxRequestLength
相同的值,修复了它,但似乎不需要这样做?据我所知,requestLengthDiskThreshold
只是文件在缓冲到磁盘之前可以达到的最大大小,但缓冲应该是透明的。NET不应该对我们隐瞒这一点吗?从代码的角度来看,这不只是一个流吗?我们的代码不在乎它是流到磁盘还是内存,而且这个要求可能会随着时间的推移而改变。。。。。。数十个客户端都使用500MB的RAM(在我们的系统中就是这样),这可能会导致IIS很快耗尽RAM。我只是想说清楚,并不是说你的答案是错误的,只是在这里的框架中似乎有些东西不太正确。