2011-10-09 2 views
0

현재 FileStream을 사용하여 파일을 열고이 파일을 처리하기 위해 StreamReader에 정보를 전달하는 C# 프로젝트를 작성 중입니다.메서드 완료 후 스트림 재사용

내가 할 수 있기를 원하는 것은 스트림을 다른 메서드로 전달하고 처리를 수행 한 다음 해당 메서드가 완료되면 원래 메서드는 동일한 스트림을 전달하는 다른 메서드를 호출합니다. 그러나 두 번째 메서드가 호출 될 때 첫 번째 스트림 프로세스가 완료되면 스레드를 읽을 수 없다는 예외를 표시합니다.

스트림을 디버깅 할 때 스트림에 대한 세부 정보를 볼 때 스트림을 읽거나 검색하거나 쓸 수 없다고 말하면 스트림의 길이 매개 변수는 System.ObjectDisposedException 유형의 예외를 발생시킵니다.

질문은 두 번째 스트림에서 동일한 스트림을 처리 할 수 ​​있도록 첫 번째 메서드가 완료된 후 어떻게 스트림을 읽을 수있게 할 수 있습니까?

도움을 주셔서 감사합니다.

+2

'ObjectDisposedException'은 소비자가 스트림을 읽은 후 (의도하지 않게, 아마도'using '블록을 통해) 스트림을'Dispose '한 것처럼 들리게합니다. 그게 효과가 없을거야. – bzlm

답변

-1

정확하게 이해했다면 스트림이 너무 빨리 닫히고 있습니다. 귀하가 말한 바에 따르면, Closing 또는 DisposingStreamReader이며 문서에 따르면 기본 스트림이 닫히기 때문일 수 있습니다.

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에서 나는 독자/작가가 매개 변수화 될 것, 듣고 당신의에서는 StreamReader는 (단지 CryptoStream을 같이 지금 한)

4

경우 "using"문을 사용하면 문 블록의 끝에 파일 스트림을 배치합니다.

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

간단한 솔루션이 대부분의 방법 TextReader를 인터페이스를 통해 파일 스트림에 액세스하는 경우

[상세 생각] 을하면 리더가 이렇게 회피 전달할 수 (GC)에이를두고 명시 판독기를 배치하는 것이 아니다 소유권 문제.

관련 문제