В приведенном выше примере FileSystemWatcher
сохраняется только потому, что для свойства EnableRaisingEvents
установлено значение true
. Тот факт, что класс Singleton имеет обработчик события, зарегистрированный для события FileSystemWatcher.Changed
, не имеет прямого отношения к тому, что fsw
имеет право на сборку мусора. См. Остановлены ли обработчики событий для сбора мусора? для получения дополнительной информации.
Следующий код показывает, что с EnableRaisingEvents
, установленным на false
, объект FileSystemWatcher
является сборщиком мусора: после вызова GC.Collect()
свойство IsAlive
в WeakReference
равно false
.
class MyClass
{
public WeakReference FileSystemWatcherWeakReference;
public MyClass()
{
var fileToWatch = @"d:\temp\test.txt";
var fsw = new FileSystemWatcher(
Path.GetDirectoryName(fileToWatch),
Path.GetFileName(fileToWatch));
fsw.Changed += OnFileChanged;
fsw.EnableRaisingEvents = false;
FileSystemWatcherWeakReference = new WeakReference(fsw);
}
private void OnFileChanged(object sender, FileSystemEventArgs e)
{
// process file...
}
}
class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
GC.Collect();
Console.WriteLine(mc.FileSystemWatcherWeakReference.IsAlive);
}
}