2017-04-21 108 views
0

我有一個使用FileSystemWatcher類的程序。它通過在文件夾中的每個子文件夾中添加新的FileSystemWatcher來工作,每個FileSystemWatcher需要8 kB的內存。FileSystemWatcher處理後需要內存嗎?

FileSystemWatchers被添加到列表「監視器」,其中可能是成千上萬的。

當我打電話方法

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

我希望所有的人都停止(他們沒有),但沒有內存從RAM釋放。

我該如何解決這個問題?

 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()不是reccomended - 程序崩潰。 ;-) –