方法完成后重用流

时间:2011-10-09 19:23:57

标签: c# streamreader

我目前正在开发一个C#项目,该项目使用FileStream打开文件并将信息传递给StreamReader以便进行处理。

我想要做的是我有一个方法将流传递给另一个方法,该方法执行处理,一旦该方法完成,原始方法调用另一个方法传递相同的流。但是,当第一个流进程在第二个方法被调用时完成时,它会显示一个异常,说明该线程不可读。

当我查看调试流时,当我查看有关流的详细信息时,它表示无法读取,搜索或写入,并且流的长度参数表示抛出了System.ObjectDisposedException类型的异常。

问题是,如何在第一个方法完成后保持流可读,以便可以在第二个流中处理相同的流。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:4)

如果您的streamReader是“using”语句的一部分,它会将文件流置于语句块的末尾。

using (StreamReader reader = new StreamReader(fileStream))
{
      ..
}

简单的解决方案是不要明确地处理读者,将其留在GC

[更多想法] 如果大多数方法都是通过TextReader接口访问文件流,则可以通过读者,从而避免了所有权问题。

答案 1 :(得分:-1)

如果我理解正确,您的信息流关闭速度过快。根据您的说法,可能是因为您是ClosingDisposing StreamReader,根据文档,它会关闭基础流。

尝试不关闭StreamReader(在不需要之后忽略它)。

例如,如果您的代码如下所示:

void P()
{
    var stream = new FileStream();
    P1(stream);
    P2(stream);
}

void P1(FileStream stream)
{
    using (var reader = new StreamReader(stream))
    {
      ......
    } //Here you would have disposed StreamReader and close FileStream
}


void P2(FileStream stream) // Stream is already closed
{
}

您已在第一种方法中关闭了您的信息流。如果您致电:

,则会遇到同样的问题
  • reader.Dispose();
  • reader.Close();
  • stream.Dispose();
  • stream.Close();
  • 使用(流);

所以要确保没有做任何这些事情。

顺便说一句:在C#5中,我听说过读者/作者将被参数化,如果你想在它们关闭时关闭它们(就像CryptoStream现在一样)