문제

방금 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;
         }
      }
   }
}

우리가 놓치고 있는 것이 있습니까? 아니면 이것이 .NET3.5 SP1의 예외입니까?

도움이 되었습니까?

해결책

그냥 생각...여기에 교착 상태 문제가 있을 가능성이 있나요?

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

.Invoke를 .BeginInvoke로 변경하고 도움이 되는지 확인하세요.그것은 당신을 올바른 방향으로 안내하는 데 도움이 될 수 있습니다.

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

다른 팁

Scott, .NET 2에서 control.Invoke에 문제가 가끔 발생하는 것을 확인했습니다.control.BeginInvoke로 전환하여 도움이 되는지 확인하세요.

그렇게 하면 FileSystemWatcher 스레드가 즉시 반환될 수 있습니다.귀하의 문제는 어쨌든 control.Invoke가 차단되어 FileSystemWatcher가 처리 시 정지되는 것 같습니다.

우리도 이 문제를 겪고 있습니다.우리 애플리케이션은 .Net 2.0에서 실행되지만 VS 2008 SP1로 컴파일되었습니다..NET 3.5 SP1도 설치되어 있습니다.왜 이런 일이 발생하는지 전혀 모르겠습니다. 이 시점에서 다른 스레드가 실행되고 있지 않기 때문에(응용 프로그램이 종료되는 동안) 우리 쪽에서는 교착 상태 문제처럼 보이지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top