嗨为什么 using (var sw = new StreamWriter(ms))回来Cannot access a closed Stream exception.Memory Stream在此代码之上.
using (var ms = new MemoryStream())
{
using (var sw = new StreamWriter(ms))
{
sw.WriteLine("data");
sw.WriteLine("data 2");
ms.Position = 0;
using (var sr = new StreamReader(ms))
{
Console.WriteLine(sr.ReadToEnd());
}
} //error here
}
Run Code Online (Sandbox Code Playgroud)
什么是解决它的最佳方法?谢谢
Tho*_*mar 83
这是因为在StreamReader处理时自动关闭底层流.该using声明自动执行此操作.
但是,StreamWriter你正在使用的仍在尝试处理流(同样,using编写器的语句现在正试图处理,StreamWriter然后尝试关闭流).
解决此问题的最佳方法是:不要使用using并且不要处理StreamReader和StreamWriter.看到这个问题.
using (var ms = new MemoryStream())
{
var sw = new StreamWriter(ms);
var sr = new StreamReader(ms);
sw.WriteLine("data");
sw.WriteLine("data 2");
ms.Position = 0;
Console.WriteLine(sr.ReadToEnd());
}
Run Code Online (Sandbox Code Playgroud)
如果您感觉不好sw并且sr没有被丢弃在代码中(如推荐的那样)进行垃圾收集,您可以执行以下操作:
StreamWriter sw = null;
StreamReader sr = null;
try
{
using (var ms = new MemoryStream())
{
sw = new StreamWriter(ms);
sr = new StreamReader(ms);
sw.WriteLine("data");
sw.WriteLine("data 2");
ms.Position = 0;
Console.WriteLine(sr.ReadToEnd());
}
}
finally
{
if (sw != null) sw.Dispose();
if (sr != null) sr.Dispose();
}
Run Code Online (Sandbox Code Playgroud)
NtF*_*reX 13
从.net45开始,您可以使用LeaveOpen构造函数参数StreamWriter和stil使用该using语句.
using (var ms = new MemoryStream())
{
using (var sw = new StreamWriter(ms, Encoding.UTF8, 1024, true))
{
sw.WriteLine("data");
sw.WriteLine("data 2");
}
ms.Position = 0;
using (var sr = new StreamReader(ms))
{
Console.WriteLine(sr.ReadToEnd());
}
}
Run Code Online (Sandbox Code Playgroud)
当StreamReader的using()结束时,它会处理对象并关闭StreamWriter仍在尝试使用的流.
| 归档时间: |
|
| 查看次数: |
104902 次 |
| 最近记录: |