Как узнать, какой FileSystemWatcher вызывает метод? - PullRequest
2 голосов
/ 17 августа 2011

Я создаю список FileSystemWatchers.

List<ExtSystemFileWatcher> fswMonitors = new List<FileSystemWatcher> ();

Количество их в списке является динамическим в зависимости от пользователя. Это делается из INI-файла, и создается массив объектов Monitor из моего собственного класса Monitor. У класса просто есть переменные, такие как число Монтиора, путь к монитору, Ext для поиска и т. Д.

if (iNumberMonitors > 0)
{
    obMonitors = ReadMonitors(iNumberMonitors);

    for (int iCounter = 0; iCounter < iNumberMonitors; iCounter++)
    {
        FileSystemWatcher fswCurrent = new FileSystemWatcher();
        fswCurrent.Path = obMonitors[iCounter].strMonPath;
        fswCurrent.EnableRaisingEvents = true;
        fswCurrent.NotifyFilter = NotifyFilters.FileName;
        fswCurrent.Filter = "*." + obMonitors[iCounter].strMonExt;
        fswCurrent.Deleted += OnDelete;
        fswMonitors.Add(fswCurrent);
    }
}

В методе OnDelete, который вызывает каждый FileSystemWatcher, если происходит событие Delete, мне нужно знать, какой из FileSystemWatchers вызывает его.

У меня вопрос: как узнать, какой FileSystemMonitor в списке вызывает метод?

Ответы [ 6 ]

2 голосов
/ 17 августа 2011

Вам нужно что-то еще, кроме проверки sender в вашем EventHandler?

private void OnDelete(object sender, ...)
{
    var watcher = (FileSystemWatcher) sender;

    // probably list.IndexOf here if you really need an index
}
2 голосов
/ 17 августа 2011

Вы можете использовать замыкание, где вы подключаете «Удалить событие» вместо передачи самого метода:

fswCurrent.Deleted += OnDelete;

вы передаете что-то вроде

fswCurrent.Deleted += (sender, e) => OnDelete(sender, e, iCounter)

Конечно, вам потребуется изменить подпись OnDelete, чтобы получить дополнительный индекс. После прочтения вашего комментария он может вам и не понадобиться, как подсказывают другие ответы.

1 голос
/ 17 августа 2011

Просто приведите параметр sender обработчика событий, который вы прикрепляете к событию Deleted.

Например:

class Program
{
    static void Main(string[] args)
    {
        var watcher = new FileSystemWatcher { Path = @"c:\temp", Filter = "*.txt" };
        watcher.Deleted += watcher_Deleted;
        watcher.EnableRaisingEvents = true;
        Console.ReadLine();
    }

    static void watcher_Deleted(object sender, FileSystemEventArgs e)
    {
        var watcher = sender as FileSystemWatcher;
    }
}
1 голос
/ 17 августа 2011

Параметр «отправитель» в методе OnDelete будет указывать на отправителя события

void OnDelete(object sender, EventArgs e)
{
    var watcher = ((FileSystemWatcher) sender);
    .....
}
1 голос
/ 17 августа 2011

Обработчик события имеет параметр отправителя, который является ссылкой на FileSystemWatcher, который вызвал событие.

private static void OnDeleted(object source, FileSystemEventArgs e)
{
    FileSystemWatcher watcher = source as FileSystemWatcher;
    if(watcher != null)
    {
        string deletedFile = e.FullPath;
        //Update db with watcher and deletedFile
    }
}
0 голосов
/ 17 августа 2011

Может быть проверить, есть ли в каждом из этих объединенных объектов хэш-код. Который должен быть уникальным.

...