2013-04-17 4 views
2

현재 .NET Compact Framework 3.5의 TextWriter 클래스를 사용하여 로그 항목을 파일에 기록하고 있습니다. Thats는 매우 보편적이고 단순한 작업이며 아무런 문제가 없습니다. 그러나 TextWriter를 사용하고 모든 데이터가 기록 될 때 Dispose를 호출하면 파일이 계속 열립니다.내 우선 적용되는 Dispose가 호출되지 않는 이유는 무엇입니까?

내 접근 방식은 FileStream을 초기화 한 다음 FileStream의 생성 된 인스턴스를 사용하여 StreamWriter를 초기화하는 것이 었습니다. 그런 다음 정적 메서드 Synchronized를 사용하여 동기화 된 TextWriter를 만들었습니다.

데이터가 쓰여지고 플러시 된 후 다른 프로세스에서 내 파일에 액세스 할 수없는 이유를 조사하려면 StreamWriter에서 Dispose 메서드가 재정의 된 클래스가 파생되었는지 확인하기 만하면됩니다. 코드를 실행하면 재정의 된 Dispose 메서드가 호출되지 않고 나 혼란 스럽습니다.

var fileStream = new FileStream("\\NAND_FLASH\\test.file", FileMode.OpenOrCreate); 
var streamWriter = new ExtendedWriter(fileStream, Encoding.UTF8); 

TextWriter textWriter = TextWriter.Synchronized(streamWriter); 
textWriter.Dispose(); 

그리고 파생 클래스 :

호출 코드는

internal class ExtendedWriter : StreamWriter 
{ 
    public ExtendedWriter(Stream stream) : base(stream) 
    { 
    } 

    public ExtendedWriter(Stream stream, Encoding encoding) : base(stream, encoding) 
    { 
    } 

    public ExtendedWriter(Stream stream, Encoding encoding, int bufferSize) : base(stream, encoding, bufferSize) 
    { 
    } 

    public ExtendedWriter(string path) : base(path) 
    { 
    } 

    public ExtendedWriter(string path, bool append) : base(path, append) 
    { 
    } 

    public ExtendedWriter(string path, bool append, Encoding encoding) : base(path, append, encoding) 
    { 
    } 

    public ExtendedWriter(string path, bool append, Encoding encoding, int bufferSize) : base(path, append, encoding, bufferSize) 
    { 
    } 

    protected override void Dispose(bool disposing) 
    { 
     Trace.WriteLine("Extended writer dispose!"); 
     base.Dispose(disposing); 
    } 
} 

누군가가 나에게이 동작을 설명 할 수 있습니까?

편집 : 업데이트 질문 텍스트, 난 내가 모든이가 IDisposable 인터페이스를 구현 할 때마다하도록되어 어떻게하지 생각하지 않는 .NET Compact Framework에서 3.5

+4

제공하신 코드로 저에게 도움이됩니다. 추적 실패의 문제가 아니라고 확신합니까? –

+0

사실, 전체 프레임 워크 3.5에서 코드가 예상대로 실행됩니다. 나는 어제 그것을 테스트하는 것을 놓쳤다. 닷넷 컴팩트 프레임 워크 3.5 (내가 언급 잊어 버린) 기반의 초기 테스트. 거기에있는 dispose 메서드는 호출되지 않습니다. – xodder

+0

흠. 그게 매우 이상한 소리 -하지만 난 쉽게 불행히도 자신을 위해 그것을 테스트 할 수 없습니다 : ( –

답변

2

Reflector를 사용하여 CF 3.5 BCL의 TextWriter를 살펴 보았습니다. 그래서 설명이 파생 된 이유에있다

protected virtual void Dispose(bool disposing) 
{ 
} 

을 :

public void Dispose() 
{ 
    this.Dispose(true); 
    GC.SuppressFinalize(this); 
} 

그래서는이처럼 보이는 매개 변수 폐기를 호출된다

다음은 호출하고있는 폐기,의 StreamWriter가 처리되지 않음 - TextWriter는 포함 된 StreamWriter에서 Dispose를 호출하지 않습니다. 직접 물건을 버리면됩니다.

+0

실제로이 두 가지 프레임 워크 간에는 이러한 차이가 존재한다는 것이 슬프다. 설명을 찾아 주셔서 감사합니다. – xodder

+0

나는 이것이 문제라고 생각하지 않는다. TextWriter 자체에는 리소스가 없습니다. Dispose() 본문은 전체 프레임 워크에서 마찬가지로 비어 있습니다. TextWriter.Synchronized (TextWriter)는 해당 인수를 처리하는 SyncTextWriter를 만듭니다. StreamWriter는 마찬가지로 스트림을 닫기 위해 Dispose를 재정의합니다. – Timbo

+0

아니요. 방금 다시 확인 했어. TextWriter.Synchronized는 SyncTextWriter를 만들지 만 Dispose 구현이 없으므로 기본에서 구현에있는 구현을 가진 TextWriter를 상속합니다. 분명히 CF 3.5 (그리고 아마 2.0과 아마도 3.9) 버그입니다. – ctacke

1

함께 일하고 있음을 언급 놓쳤다.

예를 들어 using 절에서 열면 Microsoft Access 데이터베이스 연결 (OleDb)을 사용하면 연결이 닫히지 않습니다.

제 생각에 이것은 당신이하는 모든 일을하지 않는 다른 컨트롤을 발견했습니다.