System.ObjectDisposedException。处理流编写器的正确方法是什么?

时间:2013-10-01 00:01:21

标签: c# .net stream

这是我的代码,不言自明。 using块终止后 - output变量被处置。为什么?我想从函数中返回它,处理StreamWriter但返回我的对象​​的正确方法是什么?

public static Stream Write(Interchange interchange)
{
    var output = new MemoryStream();
    using (TextWriter writer = new StreamWriter(output))
    {
        foreach (var rawSegment in GetRawSegments(interchange))
        {
            writer.Write(rawSegment.ToString(interchange.ElementDelimeter, interchange.SegmentTerminator));
        }

        writer.Flush();
     }

     return output;
}

3 个答案:

答案 0 :(得分:3)

有一个constructor for StreamWriter,您可以通过bool指定不关闭基础Stream

using (TextWriter writer = new StreamWriter(output, Encoding.UTF8, 1024, true))
{

请注意,您可能还希望在返回之前将MemoryStream的位置重置为零,具体取决于它的使用方式。

答案 1 :(得分:2)

除了要处理的流之外,StreamWriter没有非托管资源。调用TextWriter.Dispose()会导致关闭基础流。要保持流打开,请移除using块:

var output = new MemoryStream();
TextWriter writer = new StreamWriter(output);
foreach (var rawSegment in GetRawSegments(interchange))
{
   writer.Write(rawSegment.ToString(interchange.ElementDelimeter, interchange.SegmentTerminator));
}

writer.Flush();

return output;

PS:对于.NET 4.5及以上版本,Reed的回答看起来更优雅。

答案 2 :(得分:0)

在循环内,在必要时创建新实例...

using (StreamWriter writer = new StreamWriter(@"C:\Users\\Documents\Dev\error.txt", true))
{
    writer.WriteLine("cod: " + codERP );
}

Steamwriter自动关闭文件。

尝试(一次)获取文件写入后所需的所有信息(内部)