Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Обработка поступающих файлов


Автор: Wilko 3.3.2012, 23:19
Вопрос состоит в следующем.
Есть директория в которую поступают текстовые файлы. Программе необходимо мониторить эту директорию и записывать информацию из файлов в базу данных.
Начинал с начала, вроде бы все сделал(директорию мониторит, файл читает, в базу записывает).
Осталось добавить возможность мониторинга нескольких файлов, и тут уперся в проблему, которую сам не смог решить.
Файл содержит большие объемы данных(100к+ строк минимум), что значит что необходим дополнительный буфер, куда filesystemwathcer будет складывать инфу о том какие файлы поступили(для обработки). 
Пока я вижу это так, при евенте от fsw записывать путь к файлу в List. Но вот проблема, как мне также беспрерывно мониторить этот лист на наличие файлов для обработки внутри программы?

Автор: Экскалупатор 4.3.2012, 12:25
класс который управляет листом(ты же не имеешь ввиду просто List<T> в который может писать кто угодно? если так то надо переделать) должен оповещать всех подписчиков на событие изменения листа. о том что лист изменился этот класс будет знать потому что именно он и будет менять лист(точнее всем кому надо будут менять лист через этот класс)

Автор: Dennnis 10.4.2012, 19:14
Скорее всего тут подойдет очередь, в которую fsw будет добавлять имена файлов, а другой поток будет выгребать их из этой очереди и обрабатывать. В этом случае нужно:
создать ManualResetEvent, для которого вызывать метод Set при добавлении файла в очередь.
в потоке-обработчике вызывать метод WaitOne, который будет блокировать поток до тех пор пока в очередь не поступит новый файл, примерно так:
Код

ManualResetEvent wait = new ManualResetEvent(false);
Queue<string> files = new Queue<string>();
void DoHandle()
{
    while(true)
    {
        wait.WaitOne();
        string file = files.Dequeue();
        // обработка
        if (files.Count == 0)
        {
             wait.Reset(); // если очередь пуста, ресетим wait и ждем когда fsw добавит новый файл
        }
    }
}

Но надо сказать сразу, что здесь нужно использовать потокобезопасную вариант очереди.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)