2011-10-09 23 views
0

我目前正在使用FileStream打开文件并将信息传递给StreamReader进行处理的C#项目。方法完成后重新使用流

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

当我查看调试流时,当我查看流的细节时,它说它不能被读取,查找或写入,并且流的长度参数表示抛出了System.ObjectDisposedException类型的异常。

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

感谢您提供的任何帮助。

+2

'ObjectDisposedException'使得它听起来好像其中一个消费者在读取它后(可能无意中;可能通过'using'块)有'Dispose'流。这是行不通的。 – bzlm

回答

-1

如果我正确地理解了您的话,您的信息流就会过快关闭。根据你的说法,这可能是因为你是ClosingDisposingStreamReader,根据文档,它将关闭基础流。

尝试不关闭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(); (流);
  • 使用(流);

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

BTW:在C#5我所听到的,是读/写器将被参数化的,如果你想要再关闭时关闭底层流(就像CryptoStream就已经把现在)

4

如果您的StreamReader是“使用”语句的一部分,它将文件流放置在语句块的末尾。

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

简单的解决方案是不明确处置的读者,把它留给GC

[更多思考] 如果大部分的方法是通过TextReader的接口访问文件流,你可以通过这样的读者避免所有权问题。