Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从另一个方法结束filewatcher?_C# - Fatal编程技术网

C# 如何从另一个方法结束filewatcher?

C# 如何从另一个方法结束filewatcher?,c#,C#,下面是我编写的文件监视程序类的代码: class FileWatcher { #region Method that begins watching public static void watch() { FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = ConfigurationManager.AppSettings["Opticu

下面是我编写的文件监视程序类的代码:

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对象的声明移到它所在的方法之外来实现这一点,但我想知道是否还有其他方法可以实现这一点。

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

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

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

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

source
可能是所讨论的
FileSystemWatcher
,请尝试以下操作:

((FileSystemWatcher)source).EnableChangingEvents = false;

source
可能是所讨论的
FileSystemWatcher
,请尝试以下操作:

((FileSystemWatcher)source).EnableChangingEvents = false;
我想我可以通过移动 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的声明 对象位于其所在方法之外, 但我想知道是否还有其他原因 做这件事的方法

这正是你应该做的事情(让
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
,即使这样做毫无意义。(您想让此方法捕获文件被更改的事件;如果它实际上可以从任何地方调用,那么您如何知道该文件是否确实已更改,或者这只是来自其他地方的随机调用?

您想这样做吗

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

这就是你想做的事情吗

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

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