我目前正在开发一个C#项目,该项目使用FileStream打开文件并将信息传递给StreamReader以便进行处理。
我想要做的是我有一个方法将流传递给另一个方法,该方法执行处理,一旦该方法完成,原始方法调用另一个方法传递相同的流。但是,当第一个流进程在第二个方法被调用时完成时,它会显示一个异常,说明该线程不可读。
当我查看调试流时,当我查看有关流的详细信息时,它表示无法读取,搜索或写入,并且流的长度参数表示抛出了System.ObjectDisposedException类型的异常。
问题是,如何在第一个方法完成后保持流可读,以便可以在第二个流中处理相同的流。
感谢您提供的任何帮助。
答案 0 :(得分:4)
如果您的streamReader是“using”语句的一部分,它会将文件流置于语句块的末尾。
using (StreamReader reader = new StreamReader(fileStream))
{
..
}
简单的解决方案是不要明确地处理读者,将其留在GC
[更多想法] 如果大多数方法都是通过TextReader接口访问文件流,则可以通过读者,从而避免了所有权问题。
答案 1 :(得分:-1)
如果我理解正确,您的信息流关闭速度过快。根据您的说法,可能是因为您是Closing
或Disposing
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
{
}
您已在第一种方法中关闭了您的信息流。如果您致电:
,则会遇到同样的问题所以要确保没有做任何这些事情。
顺便说一句:在C#5中,我听说过读者/作者将被参数化,如果你想在它们关闭时关闭它们(就像CryptoStream现在一样)