2017-04-21 72 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 - 程序崩溃。 ;-) –