2014-06-09 3 views
0
나는 다음과 같은 코드로 문제를 파악 힘든 시간을 보내고있어

는 :잠금 및 동기화

public void InitList(object source, FileSystemEventArgs f) 
{ 
    if (!Monitor.TryEnter(lockObject)) 
    { 
     Monitor.Exit(lockObject); 
     return; 
    } 
    try 
    { 
     /// do something 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show("The Process Failed:" + e.ToString()); 
    } 
    finally 
    { 
     Monitor.Exit(lockObject); 

     _watcher.Path = textBox2.Text; 

     _watcher.EnableRaisingEvents = true; 
    } 
} 

나는 FileStreams를 가지고,하지만 난 제대로들을 폐쇄하고있다. 나는 그것들이 문제가 아니라고 믿는다.

프로그램을 처음 실행할 때 예외가있는 캐치로 이동합니다. File cannot be accessed. 두 번째 파일을 디렉터리로 복사하면 object synchronization method was called from an unsynchronized block of code이 표시됩니다. 이 예외는 monitor.exit(lockobject)에 있습니다.

내 프로그램, 그리고 내가 무엇을 달성하려고 해요에 대한 거친 IDEA :

FileSystemWatcher 구성 실행, 그것을 집어 때 파일 내가이 파일을 처리하고 UI (목록 상자)에 그것을보고 변경된이있다 . 내가 본 예외를 일으킬 수있는 것을 설명해 주시겠습니까?

+0

FSW 이벤트가있는 파일을 읽을 수있는 경우는 거의 없습니다. 다른 프로세스가 파일을 수정하는 중입니다. 프로세스가 파일을 닫을 때까지 임의로 오래 기다려야합니다. 모니터를 얻지 못했을 때 Monitor.Exit()을 호출하는 것은 명백한 버그입니다. –

+0

파일을 제어하는 ​​백그라운드에서 실행중인 다른 프로세스는 없습니다. 왜냐하면 나는 단순히 파일을 폴더에 복사/붙여 넣기하기 때문입니다. 그래서 FSW가 발동했을 때. 그것은 4 이벤트 (msdn fsw 매뉴얼에 따라)를 발사하고, 이제는 그 4 개를 제압하고 단 한 번에 들어올 논리가 있습니다. 하지만 내 자물쇠가 제대로 작동하지 않는 것 같습니다. – user726720

+0

당신이 검사하고 싶다면 여기에 내 코드가있다 : http://pastebin.com/DyqACh9g – user726720

답변

1

당신은 결코 Monitor.TryEnter(obj)의 내용을 잘못 이해했습니다. 입력하지 않았으므로 false를 반환하면 다시 끝내지 않아도됩니다!

보통이 같은 Monitor를 사용

void MyMethod() { 
    if (Monitor.TryEnter(lockObj)) { 
    // Do stuff 
    // Release lock 
    Monitor.Exit(lockObj); 
    } else { 
    // We didn't get a lock, crash? Log? 
    } 
} 

감안하면 지연이은 FileSystemWatcher는 "잘못된"전에 이벤트를 발사하지만, 내가 만난 문제가 필요하다고 수 있습니다를 받고있는 예외 응용 프로그램을 스트림을 닫았습니다. 즉, 파일을 열었을 때의 충돌입니다. 지연이 얼마나 오랫동안 유지되어야하는지에 대한 "일반적인"규칙은 없지만 특히 네트워크 드라이브의 경우 디스크 대기 시간보다 높은 것을 목표로 삼아야합니다! 즉 SSD에서 네트워크로 연결된 하드 드라이브에 10 밀리 초 정도가 소요될 수 있으며 100 밀리 초에 가깝습니다.

+0

나는 캐치, System.IO 예외에 대한 예외를 여전히 제공하고있어 당신의 방법을 시도했다. 프로세스는 파일에 접근 할 수 없다. – user726720

+0

무엇이 잘못 될 수 있습니까? – user726720

+0

@ user726720 이제 스레딩과 아무런 관련이 없습니다. 다른 누군가가 수정을 위해 파일을 열었습니다. 파일을 읽거나 수정 한 후 파일을 제대로 닫으시겠습니까? – flindeberg