Сделайте данные доступными для обработчика событий FileSystemWatcher

У меня есть приложение C # 5.0, которое предполагает использование FileSystemWatcher в нескольких разных каталогах.

Это приложение содержит List<> объектов. Каждый объект описывает отслеживаемый каталог, а также множество других данных, к которым должен получить доступ обработчик событий FileSystemWatcher. Эти объекты относятся к типу CustomDirectorySetting.

Это серверное приложение, и я ожидаю, что обработчики событий FileSystemWatcher будут вызываться довольно часто. Я должен убедиться, что они могут идти в ногу со своей работой и не отставать от ответа на события изменения файла. Возможно, стоит добавить, что отслеживаемые каталоги являются локальными по отношению к машине, на которой выполняется приложение.

Как я могу быстро сделать объект FileSystemWatcher CustomDirectorySetting доступным для обработчика событий каждого FileSystemWatcher, и следует ли мне использовать для этой реализации параллельную библиотеку задач? Я новичок в TPL, поэтому был бы признателен за ваши мысли о том, какие аспекты будут наиболее подходящими.


person STLDev    schedule 10.04.2013    source источник
comment
Что такое объект CustomDirectorySetting?   -  person paparazzo    schedule 10.04.2013
comment
@Blam - извините за путаницу - я должен был объяснить, что это настраиваемый тип, специфичный для приложения. Это не часть BCL.   -  person STLDev    schedule 10.04.2013


Ответы (2)


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

person nvoigt    schedule 10.04.2013
comment
Я не думал попробовать это. Я обязательно попробую. - person STLDev; 10.04.2013

Вопреки тому, что сказал nvoigt, я считаю, что создание типа, производного от FileSystemWatcher, является излишним.

Лучшим вариантом было бы иметь обработчик событий для вашего типа CustomDirectorySetting, что означает, что он сможет получить доступ к нужным вам данным через this.

class CustomDirectorySetting
{
    public string Directory { get; set; }

    public void OnChanged(object sender, FileSystemEventArgs e)
    {
        // your code here
    }
}

…

List<CustomDirectorySetting> list = …;
foreach (var setting in list)
{
    var fsw = new FileSystemWatcher(setting.Directory);
    fsw.Changed += setting.OnChanged;
    fsw.EnableRaisingEvents = true;
}

Другой вариант - использовать лямбда:

private static void OnChanged(
    CustomDirectorySetting setting, FileSystemEventArgs eventArgs)
{
    // your code here
}

…

foreach (var setting in list)
{
    var fsw = new FileSystemWatcher(setting.Directory);
    CustomDirectorySetting settingCopy = setting;
    fsw.Changed += (sender, eventArgs) => OnChanged(settingCopy, eventArgs);
    fsw.EnableRaisingEvents = true;
}

В этом случае, вероятно, будет хорошей идеей не использовать переменную цикла непосредственно в лямбда-выражении, потому что она не будет работать правильно в более старых версиях C #.

person svick    schedule 10.04.2013
comment
Вживую это выглядит очень интересным решением проблемы. У меня есть один вопрос: будет ли FileSystemWatcher продолжать работать правильно, когда он выпадает из области видимости на каждой итерации цикла foreach. У меня создалось впечатление, что он должен сохраняться, чтобы функционировать должным образом. Или, может быть, после настройки обработчиков событий его можно будет закрыть? - person STLDev; 11.04.2013