2

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);
}

したがって、上記のイベントが発生すると、新しいパスを持つ watchxmlfile() が明示的に呼び出されない限り、「batchfolderpath」でイベントを監視する必要がなくなります。

上記のイベントのリスナーのインスタンスが多すぎることによるメモリ リークを防止しようとしています。

4

2 に答える 2

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
    }
于 2013-01-28T02:37:56.163 に答える
3

変数を割り当てる必要はありません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();
}
于 2013-01-28T02:49:25.347 に答える