【问题标题】:How to end filewatcher from another method?如何从另一种方法结束 filewatcher?
【发布时间】:2010-09-17 16:01:09
【问题描述】:

以下是我编写的文件观察器类的代码:

class FileWatcher  
{  
    #region Method that begins watching  
    public static void watch()  
    {

        FileSystemWatcher watcher = new FileSystemWatcher();

        watcher.Path = ConfigurationManager.AppSettings["OpticusFileLoc"];
        watcher.Filter = ConfigurationManager.AppSettings["OpticusFileName"];

        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;

        watcher.Changed += new FileSystemEventHandler(OnChanged);
        Console.Write("\nWatcher started. Press any key to end.\n");

        watcher.EnableRaisingEvents = true;
    }
    #endregion

    #region Trigger function on change
    public static void OnChanged(object source, FileSystemEventArgs e)
    {
        Console.WriteLine("File has been changed.\n");
        //watcher.EnableRaisingEvents = false ;

        //Program.Main();
    }
    #endregion

}

如何通过 OnChanged 方法将 watcher.EnableRaisingEvents 标志设置为 false?

我想我可以通过将 FileSystemWatcher 对象的声明移到它所在的方法之外来做到这一点,但我想知道是否还有其他方法。

【问题讨论】:

    标签: c#


    【解决方案1】:

    我想我可以通过移动 FileSystemWatcher 的声明 对象在它所在的方法之外, 但我想知道是否还有另一个 方法。

    这正是您应该这样做的方式(让watcher 成为您的FileWatcher 类的成员字段)。

    也就是说,你也可以这样做:

    public static void OnChanged(object source, FileSystemEventArgs e)
    {
        Console.WriteLine("File has been changed.");
    
        var watcher = source as FileSystemWatcher;
        if (watcher != null)
        {
            watcher.EnableRaisingEvents = false;
        }
        else
        {
            // Hmm... some other object called this method.
            // Do you really want that to be allowed?
        }
    }
    

    请注意我在上面的代码中添加的注释。通常,调用public 之类的方法是一个糟糕的调用,因为这使得任何任意代码都可以调用OnChanged,即使这样做毫无意义。 (您希望此方法捕获文件被更改的事件;如果它实际上可以从任何地方调用,那么您如何知道文件实际上是否已更改,或者这是否只是来自其他地方的一些随机调用?)

    【讨论】:

    • 虽然您的第二个解决方案有效并且我很想实施它,但您为什么强烈建议将 FileSystemWatcher 对象移到方法之外?
    • 但是我仍然可以实现您的第二个解决方案并使 OnChanged 成为私有方法,不是吗?有什么理由我不应该那样做?
    • @xbonez:主要是因为FileSystemWatcher 对象本身在逻辑上是FileWatcher 类的一个组件,因此将其作为成员字段可以更直接地与其直接交互。 将它分配给一个字段可以得到什么?如果您将任何其他代码引入您想要与观察者交互的类,那么如果不维护对它的引用,就不可能这样做。
    • 明白了。这确实有道理。如果我以后添加另一个需要访问它的方法,它需要在所有方法之外。感谢您的解释。我没有任何理由不把它搬出去。我只是好奇,仅此而已。
    • @xbonez:是的,例如,您可能希望在您的FileWatcher 类中有一些能够暂停观察者或更改其过滤器的代码。当watcher 只是你的watch 方法中的一个局部变量时,它不能在其他任何地方访问。您可以OnChanged 中获取它的事实只是对象在引发事件时自己传递这一事实的方便副产品。这是特定于事件的行为,不应被视为“解决”缺少引用您需要访问的对象的成员字段的一般方法。
    【解决方案2】:

    source 可能是有问题的FileSystemWatcher,所以试试这个:

    ((FileSystemWatcher)source).EnableChangingEvents = false;
    

    【讨论】:

      【解决方案3】:

      对象源参数应该是您的 FileSystemWatcher 对象,因此您可以使用它来关闭它。

      public static void OnChanged(object source, FileSystemEventArgs e)
          {
              Console.WriteLine("File has been changed.\n");
              (source as FileSystemWatcher).EnableRaisingEvents = false;
          }
      

      【讨论】:

        【解决方案4】:

        这是你想做的事情吗?

        public static void OnChanged(object source, FileSystemEventArgs e)
        {
           FileSystemWatcher watcher = (FileSystemWatcher)source;
           watcher.EnableRaisingEvents = false ;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-29
          • 2014-08-14
          • 2016-02-11
          相关资源
          最近更新 更多