我已經使用.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