2008-09-16 4 views
7

Dispose() 호출이 중단 된 것처럼 보이는 FileSystemWatcher를 사용하여 이상한 문제가 발생하기 시작했습니다. 이것은 잠시 동안 아무런 문제없이 작업해온 코드이지만 .NET3.5 SP1로 업그레이드 했으므로 다른 사람이이 동작을 보았는지 확인하려고합니다.FileSystemWatcher 호출 중단 처리

if (this.fileWatcher == null) 
{ 
    this.fileWatcher = new FileSystemWatcher(); 
} 
this.fileWatcher.BeginInit(); 
this.fileWatcher.IncludeSubdirectories = true; 
this.fileWatcher.Path = project.Directory; 
this.fileWatcher.EnableRaisingEvents = true; 
this.fileWatcher.NotifyFilter = NotifyFilters.Attributes; 
this.fileWatcher.Changed += delegate(object s, FileSystemEventArgs args) 
{ 
    FileWatcherFileChanged(args); 
}; 
this.fileWatcher.EndInit(); 
이 사용되는 방법은의 TreeNode 객체의 상태 이미지를 업데이트하는 것입니다

가 (비즈니스 관련 정보를 제거하기 위해 약간 조정) :

private void FileWatcherFileChanged(FileSystemEventArgs args) 
{ 
    if (this.TreeView != null) 
    { 
     if (this.TreeView.InvokeRequired) 
     { 
     FileWatcherFileChangedCallback d = new FileWatcherFileChangedCallback(FileWatcherFileChanged); 
     this.TreeView.Invoke(d, new object[] 
     { 
     args 
     }); 
     } 
     else 
     { 
     switch (args.ChangeType) 
     { 
      case WatcherChangeTypes.Changed: 
       if (String.CompareOrdinal(this.project.FullName, args.FullPath) == 0) 
       { 
        this.StateImageKey = GetStateImageKey(); 
       } 
       else 
       { 
        projectItemTreeNode.StateImageKey = GetStateImageKey(); 
       } 
       break; 
     } 
     } 
    } 
} 

인가 여기은 FileSystemWatcher를 생성하는 코드는 우리가 누락되었거나 .NET3.5 SP1에서이 이상한 것이 있습니까?

답변

7

그냥 생각 ... 여기 교착 상태 문제가있을 수 있습니까?

차단 호출 인 TreeView.Invoke를 호출하고 있습니다. FileSystemWatcher.Dispose() 호출을 발생시키는 버튼을 클릭하는 것처럼 파일 시스템 변경이 발생하면 FileWatcherFileChanged 메서드가 백그라운드 스레드에서 호출되고 폼 스레드가 Invoke 요청을 처리 할 수있을 때까지 차단되는 TreeView.Invoke를 호출합니다 . 그러나 폼 스레드는 FileSystemWatcher.Dispose()를 호출 할 것이고, 보류중인 모든 변경 요청이 처리 될 때까지 반환되지 않을 것입니다.

.Invoke를 .BeginInvoke로 변경하고 그 도움이되는지 확인하십시오. 그것은 올바른 방향으로 당신을 도울 수 있습니다.

물론 .NET 3.5SP1 문제 일 수도 있습니다. 나는 당신이 제공 한 코드를 토대로 여기서 추측하고있다.

1

우리는 또한이 문제가 있습니다. 우리의 응용 프로그램은 .Net 2.0에서 실행되지만 VS 2008 SP1에 의해 컴파일됩니다. .NET 3.5 SP1도 설치되어 있습니다. 왜 이런 일이 발생하는지 전혀 알지 못하지만,이 시점에서 다른 스레드가 실행되고 있지 않아 (응용 프로그램 종료 중) 교착 상태 문제가되지 않습니다.

+0

FileSystemWatcher를 사용하는 경우 다른 스레드를 사용할 가능성이 있습니다. FileSystemWatcher 스레드가 UI 스레드에서 호출을 시도 할 때 차단 될 수 있습니다. –

2

Scott, 때때로 우리는 control과 관련된 문제를 보았습니다. .NET에서 살펴보십시오. control.BeginInvoke로 전환하여 도움이되는지보십시오.

이렇게하면 FileSystemWatcher 스레드가 즉시 반환됩니다. 나는 당신의 문제가 어떻게 든 그 control.Invoke가 차단되어서, 따라서 FileSystemWatcher가 처분시 멈추는 원인이되었다고 생각합니다.

+0

이것은 정확한 해결책 인 것처럼 보입니다. Jonathan이 응답 한 첫 번째 답변을 수여했습니다. –