You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套StreamWriter与StreamReader异常:System.ObjectDisposedException成因问询

排查 System.ObjectDisposedException 异常的踩坑经历

最近遇到一个有意思的问题:我写的两段代码里,其中一段的第2行直接抛出了System.ObjectDisposedException异常。

最开始我想都没想就觉得原因很明确——肯定是和引用fs绑定的流已经在第1行被关闭了,第2行又傻乎乎地去关闭同一个流,重复释放资源才触发的异常。这个逻辑听起来完全站得住脚,毕竟在.NET里,对已经释放的对象执行操作,十有八九会抛出这类资源已释放的异常。

不过我这人有点较真,总觉得不能只停留在表面解释上,于是折腾了好几组不同的测试:

  • 第一组测试:我单独写了一段代码,先关闭流,紧接着调用流的Read方法,结果不出意外,同样抛出了System.ObjectDisposedException,这说明重复操作已释放的流确实会触发异常,我的初始猜想有一定道理。
  • 第二组测试:我把流的操作放进using语句里(懂的都懂,using会自动帮我们处理资源释放),然后在using块外面尝试访问这个流,依然触发了异常,这进一步坐实了“资源释放后无法操作”的特性。
  • 但第三组测试却给了我当头一棒:我在同一个方法里,先关闭了原来的流,然后给fs重新赋值了一个全新的流实例,再调用Close方法,这次居然完全没报错!

这时候我才反应过来,最初的解释其实只对了一半:异常的核心不是“重复调用Close方法”,而是你调用Close时,fs指向的那个对象已经被释放销毁了。如果后续fs指向的是一个新的、未被释放的流实例,哪怕之前的实例已经被关闭,也不会有任何问题。

所以给大家提个醒:遇到这类异常时,别只盯着“重复释放”这一个点,还要检查一下变量有没有被重新赋值,是不是后续操作的对象已经不是你最初创建的那个流了。


内容的提问来源于stack exchange,提问作者gamerdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:38:45