我已经使用.net FileSystemWatcher类写了一个简单的测试工具。问题是我得到了内存泄漏,因为MemoryLeakTest的实例被FileSystemWatcher中更改的处理程序引用。清理这个引用的正确方法是什么,以便垃圾收集器可以在之后收集MemoryLeakTest实例和FileSystemWatcher实例?.net事件处理程序使用filesystemwatcher清理
要看到堆泄漏情况下,按照此说明: http://blogs.msdn.com/b/calvin_hsia/archive/2008/04/11/8381838.aspx
预先感谢您的咨询
using System;
using System.IO;
namespace MemoryLeakTest {
class Leaking {
private FileSystemEventHandler changedHandler;
private FileSystemWatcher fsw;
public Leaking() {
changedHandler = new FileSystemEventHandler(fsw_Changed);
fsw = new FileSystemWatcher("c:\\", "*.*");
fsw.Changed += changedHandler;
fsw.EnableRaisingEvents = true;
}
~Leaking() {
fsw.Changed -= changedHandler;
fsw.Dispose();
}
void fsw_Changed(object sender, FileSystemEventArgs e) {
Console.WriteLine("Changed");
}
}
class Program {
static void Main(string[] args) {
for (int i = 0; i < 100; ++i) {
var x = new Leaking();
}
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Console.ReadLine();
}
}
}
那么您应该实现IDisposable并在.Dispose()中执行清理,而不是在终结器中。 – asawyer 2011-05-19 12:57:24
然后,我必须在某处手动调用Dispose()以获取较长的活动对象。我希望自动执行此步骤,所以我不会忘记这么做。 – agaga 2011-05-19 13:09:40
经过一些研究后,似乎必须在每个具有实现IDisposable的成员的类中实现IDisposable。这似乎很容易将我的整个数据模型“污染”到根对象。我错过了什么吗? – agaga 2011-05-19 15:36:35