我有一个使用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;
}
}
答案 0 :(得分:0)
当您将所有观察者放入列表中时 - 您已经从列表中创建了对它们的引用,因此当此列表处于“活动状态”时,垃圾收集器无法释放观察者所占用的内存。
您还必须从列表中删除它们:
watchers.Clear();
此外,如果您有其他对您的观察者的引用(包括订阅其事件的事件处理程序) - 您必须清除这些引用(也取消订阅事件),以便垃圾收集器释放观察者所占用的内存。
在任何情况下,你都不应期望记忆能够立即被释放。垃圾收集器不会一直运行,因此内存可能需要一段时间才能释放。
您可以使用GC.Collect()强制垃圾收集器释放内存,但通常不建议这样做。