C# 在方法完成后重用流

C# 在方法完成后重用流,c#,streamreader,C#,Streamreader,我目前正在从事一个C#项目,该项目使用文件流打开文件,并将信息传递给StreamReader进行处理 我希望能够做的是,我有一个方法将流传递给另一个方法,该方法进行处理,一旦该方法完成,原始方法将调用另一个方法,并将其传递给同一个流。但是,当第一个流进程完成时,当调用第二个方法时,它会显示一个异常,表示线程不可读 当我查看调试流时,当我查看有关流的详细信息时,它表示无法读取、查找或写入,流的长度参数表示抛出了System.ObjectDisposedException类型的异常 问题是,如何在第

我目前正在从事一个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
使它听起来像是一个消费者在读取流后处理了它(可能是无意的;可能是通过
使用
块)。这不起作用。