C# 在方法完成后重用流
我目前正在从事一个C#项目,该项目使用文件流打开文件,并将信息传递给StreamReader进行处理 我希望能够做的是,我有一个方法将流传递给另一个方法,该方法进行处理,一旦该方法完成,原始方法将调用另一个方法,并将其传递给同一个流。但是,当第一个流进程完成时,当调用第二个方法时,它会显示一个异常,表示线程不可读 当我查看调试流时,当我查看有关流的详细信息时,它表示无法读取、查找或写入,流的长度参数表示抛出了System.ObjectDisposedException类型的异常 问题是,如何在第一个方法完成后保持流的可读性,以便在第二个流中处理相同的流C# 在方法完成后重用流,c#,streamreader,C#,Streamreader,我目前正在从事一个C#项目,该项目使用文件流打开文件,并将信息传递给StreamReader进行处理 我希望能够做的是,我有一个方法将流传递给另一个方法,该方法进行处理,一旦该方法完成,原始方法将调用另一个方法,并将其传递给同一个流。但是,当第一个流进程完成时,当调用第二个方法时,它会显示一个异常,表示线程不可读 当我查看调试流时,当我查看有关流的详细信息时,它表示无法读取、查找或写入,流的长度参数表示抛出了System.ObjectDisposedException类型的异常 问题是,如何在第
谢谢你能提供的帮助 如果我理解正确,您的流关闭得太快了。根据您所说的,可能是因为您正在
关闭
或处理
,根据文档,这将关闭底层流
尝试不关闭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
{
}
您已在第1种方法中关闭流。如果您拨打以下电话,您也会遇到同样的问题:
- reader.Dispose()李>
- reader.Close()李>
- stream.Dispose()李>
- stream.Close()李>
- 使用(流)李>
顺便说一句:在C#5中,我听说读写器将被参数化,如果您想在关闭底层流时关闭它们(就像CryptoStream现在所做的那样)如果我理解正确,您的流关闭得太快了。根据您所说的,可能是因为您正在
关闭
或处理
,根据文档,这将关闭底层流
尝试不关闭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
{
}
您已在第1种方法中关闭流。如果您拨打以下电话,您也会遇到同样的问题:
- reader.Dispose()李>
- reader.Close()李>
- stream.Dispose()李>
- stream.Close()李>
- 使用(流)李>
顺便说一句:在C#5中,我听说读写器将被参数化,如果您想在关闭底层流时关闭它们(就像CryptoStream现在所做的那样)如果您的streamReader是“using”语句的一部分,它将在语句块的末尾处理文件流
using (StreamReader reader = new StreamReader(fileStream))
{
..
}
简单的解决方案是不显式地处理读取器,而将其留给GC
[更多想法]
如果大多数方法都是通过TextReader接口访问文件流,则可以传递reader,从而避免所有权问题。如果streamReader是“using”语句的一部分,则它将在语句块的末尾处理文件流
using (StreamReader reader = new StreamReader(fileStream))
{
..
}
简单的解决方案是不显式地处理读取器,而将其留给GC
[更多想法]
如果大多数方法都是通过TextReader接口访问文件流,那么您可以传递reader,从而避免所有权问题。ObjectDisposedException听起来好像其中一个使用者在读取流后已对其进行了
Dispose
d处理(可能是无意的;可能是通过使用
块)。这不起作用。ObjectDisposedException
使它听起来像是一个消费者在读取流后处理了它(可能是无意的;可能是通过使用
块)。这不起作用。