处理后FileSystemWatcher占用内存?

时间:2017-04-21 12:27:41

标签: c# filesystemwatcher

我有一个使用FileSystemWatcher类的程序。它的工作原理是在文件夹中的每个子文件夹上添加新的FileSystemWatcher,每个FileSystemWatcher需要8 kB的内存。

FileSystemWatchers被添加到“watchers”列表中,其中可能有数千个。

当我打电话给方法时

 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 个答案:

答案 0 :(得分:0)

当您将所有观察者放入列表中时 - 您已经从列表中创建了对它们的引用,因此当此列表处于“活动状态”时,垃圾收集器无法释放观察者所占用的内存。

您还必须从列表中删除它们:

watchers.Clear();

此外,如果您有其他对您的观察者的引用(包括订阅其事件的事件处理程序) - 您必须清除这些引用(也取消订阅事件),以便垃圾收集器释放观察者所占用的内存。

在任何情况下,你都不应期望记忆能够立即被释放。垃圾收集器不会一直运行,因此内存可能需要一段时间才能释放。

您可以使用GC.Collect()强制垃圾收集器释放内存,但通常不建议这样做。