2014-12-01 5 views
0

FileStream 인 클래스 멤버 변수가 있습니다. 이 변수는 생성자에서 초기화되며 클래스를 완료 할 때까지 계속 사용해야합니다. 나는 뭔가를 파일에 쓸 필요가있을 때마다 이벤트를 발생시키는 또 다른 클래스를 가지고있다. 내 메인 클래스에는 실제 작성을 수행하는 이벤트 핸들러가 있습니다. 나는 this question에서와 같이 다음 코드를 시도 :"using"을 사용하지 않고 FileStream을 사용하여 파일에 쓰기

void MyEventHandler(string message) 
{ 
    using (_stream) 
     using (StreamWriter s = new StreamWriter(_stream)) 
      s.WriteLine(message); 
} 

을하지만 그것으로 끝났어요 전에이 내 FileStreamusing 때문에 처분하는 작동하지 않습니다. 대신 내가 무엇을해야합니까?

+0

그냥 사용하지 마십시오. – Ahmad

+0

_stream의 출처는 어디입니까? 실제 오류/증상은 무엇입니까? 이 질문은 불분명하고 불완전합니다. –

답변

4

먼저 스트림을 직접 처분 할 명확하게 using (_stream)을 제거해야합니다.

두 번째로 StreamWriter입니다. 현재 코드로 처리하십시오. 이것에 대한 옵션은 다음과 같습니다

  • 이 중 하나 StreamWriter에 대한 using 문을 가지고 있지만, 명시 적으로이 즉시 파일에 기록해야하는 경우 작가를 세척하지 마십시오

    void MyEventHandler(string message) 
    { 
        var s = new StreamWriter(_stream); 
        s.WriteLine(message); 
        s.Flush(); 
    } 
    
  • 사용 StreamWriter의 생성자는 StreamWriter이 처리 될 때 스트림이 닫혀 있는지 여부를 제어 할 수 있습니다.

    void MyEventHandler(string message) 
    { 
        using (var s = new StreamWriter(_stream, Encoding.UTF8, 1024, true)) 
        { 
         s.WriteLine(message); 
        } 
    } 
    
  • 코드를 변경하여 Stream 대신 클래스의 필드를 TextWriter으로 시작하십시오 (원하는 파일/스트림에 대해 StreamWriter으로 초기화 됨). 그런 다음 새 필드를 만들 필요가 없습니다 방법에있어서 StreamWriter.

Servy 노트로, 자신의 클래스는 IDisposable를 구현해야하고 Dispose 방법 스트림/라이터 폐기하십시오.

6

그냥 using을 생략하십시오.

이 경우이 메서드를 정의하는 클래스는 IDisposable을 구현해야하며 스트림을 Dispose 메서드로 처리해야합니다. 이 클래스의 사용자는 using 블록에 선언해야합니다.

+0

'StreamWriter'는'(StreamWriter s ...) '를 사용하는 경우 스트림을 처분하려고 시도합니다. ... 적어도 Writer와 Raw Stream을주의 깊게 조심해야합니다. - 적어도 최소한 .Flush() 완료되었습니다. –

2

using은 암시 적으로 개체를 처리하는 함수에서 지역 변수로 사용되지만 클래스의 멤버 인 경우 클래스가 삭제 될 때 처리해야합니다.

class YourClass : IDisposable 
{ 
    .... 
    public void Dispose() 
    { 
     Dispose(true); 
    } 

    protected virtual void Dispose(bool disposing) 
    { 
     if (disposing) 
     { 
     _stream.Dispose(); 
     } 
    } 
} 
관련 문제