2017-04-21 15 views
0

FileSystemWatcher 클래스를 사용하는 프로그램이 있습니다. 폴더의 각 하위 폴더에 새 FileSystemWatcher를 추가하면 각 FileSystemWatcher가 8KB의 메모리를 사용합니다.처분 후 FileSystemWatcher가 메모리를 차지합니까?

FileSystemWatchers는 "watcher"목록에 추가됩니다. 여기에서 수천 개가 될 수 있습니다.

나는 어떤 메모리가 RAM에서 해방되지 않는 방법

watchers.ForEach(x => x.Dispose()); 

나는 (그들이 한 함) 중지 그들 모두를 예상 부르지 만 합니다.

어떻게 해결할 수 있습니까? 당신이 그들에게 목록에서 참조를 만든, 그래서이 목록은 "살아"있는 동안 가비지 컬렉터가 여유 메모리 전문가에 의해 수행 할 수 있습니다 - 당신이 목록에있는 모든 전문가를 배치 한

 public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 
     protected virtual void Dispose(bool disposing) 
     { 
      if (!disposed) 
      { 
       if (disposing) 
       {       
        watchers.ForEach(x => x.Dispose()); 
        watchers.Clear(); 
       } 
       disposed = true; 
      }     
     } 
+1

[IncludeSubdirectories'] (https://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.includesubdirectories (v = vs.110) .aspx) 하위보기 폴더를 만들지 않고 많은 전문가를 생성 할 수 있습니까? – shahkalpesh

+2

'Dispose'는 관리되지 않는 리소스를 해제하지만 관리되는 메모리는 해제하지 않습니다. –

+0

IncludeSubdirectories가 처음 시도되었지만 "이동"이 많으면 버퍼가 충분히 크지 않아 더 작은 관찰자를 만드는 것이 더 좋습니다. –

답변

0

.

는 또한 목록에서 제거 할 수 있습니다 또한

watchers.Clear(); 

당신이 (자신의 이벤트에 등록 된 이벤트 핸들러 포함) 전문가에 대한 다른 참조가있는 경우 - 당신은 이벤트에서 이러한 참조 (구독 취소를 취소해야 가비지 컬렉터가 관찰자가 가져온 메모리를 비울 수 있도록).

어쨌든 메모리를 즉시 해제하지 않아야합니다. 가비지 수집기가 항상 실행되고 있지 않아 메모리가 비어있는 데 시간이 걸릴 수 있습니다.

GC.Collect()을 사용하여 가비지 수집기를 강제로 메모리를 비울 수는 있지만 대개 권장하지 않습니다.

+0

작동하지 않습니다. 내가 뭘 잘못하고 있니? 나는 메인 포스트를 업데이트 할 것이다. –

+0

@JosefKvita 업데이트 된 답변보기 –

+0

왜 GC.Collect()가 권장되지 않는지 알 수 있습니다. 프로그램이 중단됩니다. ;-) –