使用using语句处置StreamWriter及Stream生成后的资源异常问题咨询
如何正确处置StreamWriter并避免返回的Stream被提前关闭?
这问题我太熟了——你遇到的异常根本原因是返回的MemoryStream已经被StreamWriter的using语句给关闭了,咱们一步步拆解解决:
问题根源
在你的GenerateStream方法里,StreamWriter被包裹在using块中。默认情况下,当using块执行完毕调用StreamWriter.Dispose()时,它会自动关闭并释放它所包装的底层流(也就是你创建的MemoryStream)。所以当你从方法返回这个stream的时候,它已经处于关闭状态了,外层的using块再去操作它,自然会抛出异常。
解决方案:让StreamWriter不关闭底层流
最优雅的解决方式是在创建StreamWriter时,传入leaveOpen: true参数。这个参数会告诉StreamWriter:在自己被Dispose的时候,只释放自身的资源,不要关闭底层的流。
修改后的GenerateStream方法代码如下:
private static Stream GenerateStream(string s) { var stream = new MemoryStream(); // 传入leaveOpen: true,避免StreamWriter关闭底层MemoryStream using (var writer = new StreamWriter(stream, leaveOpen: true)) { writer.Write(s); writer.Flush(); stream.Position = 0; } // 此时stream仍然处于打开状态,可以安全返回给外层使用 return stream; }
额外说明
- 外层的
using块会正确处置返回的MemoryStream,不用担心资源泄漏的问题。 - 你原来代码里的
var streamContent = generatedStream;其实是多余的,直接使用generatedStream即可,这不是导致异常的原因。
内容的提问来源于stack exchange,提问作者Khaine775
相关产品推荐
相关产品推荐

