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
中访问它,这只是一个方便的副产品,因为对象在引发事件时会传递自己。这是特定于事件的行为,不应被视为“绕过”缺少引用您需要访问的对象的成员字段的一般方式。