如何从FileSystemWatcher事件中处理事件侦听器

use*_*912 1 c# filesystemwatcher

使用FileSystemWatcher,是否有办法在事件触发后处理事件侦听器的实例?

我的程序基本上监听在新创建的文件夹中创建batch.complete.xml文件.程序检测到文件已创建后,无需继续侦听此文件夹.

我的程序看起来像这样:

public static void watchxmlfile(batchfolderpath){

 var deliverycompletewatcher = new FileSystemWatcher();    

 deliverycompletewatcher.Path = batchfolderpath;

 deliverycompletewatcher.Filter = "*.xml";

 deliverycompletewatcher.Created += new FileSystemEventHandler(OnChanged);

 deliverycompletewatcher.EnableRaisingEvents = true;

}


private static void OnChanged(object sender, FileSystemEventArgs e)
{
    BuildingestionXml(string.Format(@"{0}\{1}",e.FullPath,e.Name));
    Console.WriteLine(@"Second: Success sending{0}\{1}", e.FullPath, e.Name);
}
Run Code Online (Sandbox Code Playgroud)

因此,当上述事件被触发时,我不再需要在"batchfolderpath"中监视事件,除非显式调用watchxmlfile(),它将具有新路径.

我试图防止上述事件的过多侦听器实例的内存泄漏.

sa_*_*213 5

在你身上EventHandler你可以取消分配事件,但你必须将其声明FileSystemWatcher为变量.

    private static FileSystemWatcher deliverycompletewatcher;

    public static void watchxmlfile(string batchfolderpath)
    {
        deliverycompletewatcher = new FileSystemWatcher();
        deliverycompletewatcher.Path = batchfolderpath;
        deliverycompletewatcher.Filter = "*.xml";
        deliverycompletewatcher.Created += OnChanged;
        deliverycompletewatcher.EnableRaisingEvents = true;
    }


    private static void OnChanged(object sender, FileSystemEventArgs e)
    {
        deliverycompletewatcher.EnableRaisingEvents = false;
        deliverycompletewatcher.Created -= OnChanged;

        // Do some cool stuff
    }
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 5

您不需要分配变量,sender是 FileSystemWatcher:

private static void OnChanged(object sender, FileSystemEventArgs e)
{
    BuildingestionXml(string.Format(@"{0}\{1}",e.FullPath,e.Name));
    Console.WriteLine(@"Second: Success sending{0}\{1}", e.FullPath, e.Name);
    ((FileSystemWatcher)sender).Dispose();
}
Run Code Online (Sandbox Code Playgroud)