【发布时间】:2017-04-21 12:27:41
【问题描述】:
我有一个使用 FileSystemWatcher 类的程序。它通过在文件夹中的每个子文件夹上添加新的 FileSystemWatcher 来工作,每个 FileSystemWatcher 占用 8 kB 的内存。
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;
}
}
【问题讨论】:
-
IncludeSubdirectories不会帮助监视子文件夹而不是创建许多监视者吗? -
Dispose释放非托管资源,但不释放托管内存。 -
IncludeSubdirectories 是我的第一次尝试,但是当有很多“移动”时,缓冲区不够大,我读到了更好的地方以创建更多更小的观察者。
-
您订阅了
FileWatcherevents 中的任何一个吗?如果是这样,那么订阅该事件的对象将引用FileWatcher对象,直到订阅者取消订阅该事件,或者订阅者本身被垃圾回收 - 所以订阅者将保持活动FileWatcher即使您认为您已经处置了它并删除了对它的所有其他引用。 -
不,
Dispose()不会取消订阅 - 您必须手动取消订阅。这适用于所有类型,而不仅仅是FileSystemWatcher。请记住,每当您使用source.SomeEvent += someHandler()订阅时,右侧将左侧保留在内存中,直到订阅者被垃圾回收,或者您调用source.SomeEvent -= someHandler()
标签: c# filesystemwatcher