我需要保留对FileSystemWatcher的引用吗
本文关键字:引用 FileSystemWatcher 保留 | 更新日期: 2023-09-27 18:22:18
我正在使用FileSystemWatcher
(在ASP.NET web应用程序中)监视文件的更改。观察程序是在Singleton类的构造函数中设置的,例如:
private SingletonConstructor()
{
var fileToWatch = "{absolute path to file}";
var fsw = new FileSystemWatcher(
Path.GetDirectoryName(fileToWatch),
Path.GetFileName(fileToWatch));
fsw.Changed += OnFileChanged;
fsw.EnableRaisingEvents = true;
}
private void OnFileChanged(object sender, FileSystemEventArgs e)
{
// process file...
}
到目前为止一切都很好。但我的问题是:
使用本地变量(var fsw
)设置观察程序是否安全?或者我应该在私人字段中保留对它的引用,以防止它被垃圾收集?
在上面的示例中,FileSystemWatcher
之所以保持活动状态,只是因为属性EnableRaisingEvents
设置为true
。Singleton类有一个注册到FileSystemWatcher.Changed
事件的事件处理程序,这一事实与fsw
是否有资格进行垃圾回收没有任何直接关系。请参阅事件处理程序是否阻止垃圾收集的发生?了解更多信息。
以下代码显示,当EnableRaisingEvents
设置为false
时,FileSystemWatcher
对象被垃圾回收:一旦调用GC.Collect()
,WeakReference
上的IsAlive
属性就是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);
}
}