处置FileSystemWatcher

时间:2015-11-03 20:41:54

标签: c# .net .net-4.5 filesystemwatcher

所以我的理解是,每当使用实现IDisposable的类时,它的父级也需要实现IDisposable接口。 (FileWatcher使用FileSystemWatcher)

因此,在使用FileSystemWatcher时,处理FileSystemWatcher的正确方法是什么?我希望在应用程序关闭之前不要处理/(观察)FileWatcher。

我会使用负责任的所有者模式吗?(尝试/最后)或其他什么? 我的FileWatcher是否也应该实现IDisposable?我不能使用{},因为这个fileWatcher应该在整个应用程序运行时观察文件的变化。处理这种情况的正确方法是什么?

public class FileWatcher : IFileWatcher
{
    private FileSystemWatcher watcher;

    public event EventHandler<EventArgs> SettingsChanged;

    public FileWatcher(bool start)
    {
        this.RegisterForChanges();
    }

    public void OnChanged(object source, EventArgs e)
    {
        if (this.SettingsChanged != null)
        {
            this.SettingsChanged(source, new EventArgs());
        }
    }

    private void RegisterForChanges()
    {
        /// more code here etc
        ...
        this.watcher = new FileSystemWatcher
                           {
                               Path = directory, 
                               NotifyFilter =
                                   NotifyFilters.LastAccess | NotifyFilters.LastWrite
                                   | NotifyFilters.FileName | NotifyFilters.DirectoryName, 
                               Filter = fileName
                           };

        // Add event handlers.
        this.watcher.Changed += this.OnChanged;

        // Begin watching.
        this.watcher.EnableRaisingEvents = true;
    }

2 个答案:

答案 0 :(得分:4)

是的,在这种情况下(我认为)实施IDisposable是正确的解决方案。您的对象是长期存在的,并且必须超出任何特定函数调用的范围,因此所有函数范围级别的解决方案(usingtry..finally等)都已用完。

为此,IDisposable是.NET中的标准模式,您可以在处置FileWatcher时轻松处理嵌套对象。

答案 1 :(得分:1)

关闭应用程序时,请运行dispose方法。

根据请求的方法,当您想要在关闭程序时处理某些内容。

如果您正在使用类via,那么IDisposable用于处理类对象,但实质上您仍然可能希望在关闭程序时执行此操作

bool myFlag = false;
private FileSystemWatcher watcher;
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 {
           myFlag = true;
           if(myFlag)
           watcher.Dispose(); //Your FileSystemWatcher object
 }