2012-07-25 3 views
1

모노 스트림으로 작업하는 동안 정말 이상한 문제가 있습니다. 나는이 같은 스트림을 엽니 물론 _stream이하여 FileStream입니다스트림/파일의 소유권을 포기하십시오.

_stream = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.Read); 

. 나는 그런이 클래스의 처분 방법을 추가 :

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

private void Dispose(bool disposing) 
{ 
    if(!_disposed) 
    { 
     if(disposing) 
     { 
      _stream.Flush(true); 
      _stream.Dispose(); 
      _items.Clear(); 
     } 
     _disposed = true; 
    } 
} 

지금 내가이 간단한 테스트가 있습니다

[Test] 
public void SimpleTest() 
{ 
    SyncFileWriter s = new SyncFileWriter("file"); 
    s.Save("a", "b"); 
    s.Dispose(); 

    SyncFileWriter s2 = new SyncFileWriter("file"); 
    s2.Dispose(); 
} 

을하지만 IOException를 표시해 실패하는 경우 : 공유 위반. [edit] monodevelop에 오류가있는 것처럼 보입니다. 다시 시작했지만 매번 실패합니다 [편집]

이 문제를 방지하고 스트림을 올바르게 닫으려면 어떻게해야합니까?

+0

이것은 간단한 타이밍 문제 일 수 있습니다 (Win 파일 시스템은 느려질 수 있음). 다시 테스트하기 전에'Thread.Sleep (10); '으로 테스트하고 해결할 수 있습니다. –

+0

시스템이 멀티 스레드입니까? non-deterministic은 경쟁 조건과 다른 스레드 (예 : 명시 적으로 또는 이벤트를 통해 생성 된 스레드)에 동시에 존재하는 두 가지가 있을지 여부를 생각하게합니다. – Chris

+0

흠. 심지어 Thread.Sleep (1000)은 어떤 진보도하지 않을 것입니다. 물론 내 시스템은 다중 코드가 있지만 NUnit이며 한 번에 하나의 테스트 만 실행되도록해야합니다. 그래서 이것은 문제가 아닙니다. – hellow

답변

0

그것은 내 잘못처럼 보인다. SyncFileWriter는 파일이 존재하는지 여부를 검사하는 추상 클래스에서 파생됩니다. 그렇지 않은 경우, 일부 기본 것들로이 파일을 초기화하고 내가 왜 그랬는지 그건 당신이 볼 때, 나는 파일을 만들 수 있지만 File.Create는 스트림을 열고 그것의 떠난 후 닫습니다하지 않습니다

File.Create(filename); 

다음 범위, 뭐든간에. 는 지금이 수행

Filestream f = File.Create(filename); 
... 
f.Dispose(); 

를 모든 것이 괜찮습니다.

첫 번째 비결정 론적 행동에 대한 문제가 있다고 생각합니다. 매개 변수가 null이고 새 파일을 만들 때만 null이므로이 작업 만 수행하기 때문입니다.

어쨌든 도와 주셔서 감사합니다.

-1

없음 아주 당신이 달성하려고하는,하지만이 도움이 될 수 추측 무엇인지는 : http://www.blackwasp.co.uk/UsingStatement.aspx

+0

저는 파일의 소유권을 가지고 전체 시간 동안 스트림을 사용하여 스트림을 다른 클래스와 함께 캡슐화하는 것을 좋아합니다. 그리고 제가 보관하려고하는 것은 제가 말한 것입니다. 스트림을 사용하고 나중에 닫으려고합니다.) – hellow

관련 문제