FileSystemWatcher иногда не работает - PullRequest
3 голосов
/ 13 февраля 2012

У меня есть FileSystemWatcher для проверки новых файлов, сохранения содержимого в базе данных и удаления файлов.Около 10 дней назад он начал игнорировать некоторые файлы.Мы говорим о 1500 файлах из 50000 файлов.Путем ручного перемещения файлов в другой каталог и последующего их перемещения в просматриваемый каталог файлы замечаются.

Параметр InternalBufferSize имеет значение 32 КБ для обработки больших пакетов.Он обрабатывает более 300 файлов одновременно без проблем, и реальность даже близко не подходит к этому.

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

Что может вызвать внезапное появление проблемы, подобной этой?Есть ли вероятность, что FileSystemWatcher просто ненадежен ?

Редактировать Я создал тест, в котором создано 1000 файлов.После запуска 3000 записей можно найти в журнале событий.Поэтому я считаю, что о переполнении буфера не может быть и речи?

    private void button1_Click(object sender, EventArgs e)
    {
        fsw = new FileSystemWatcher();
        fsw.Path = @"C:\temp\fsw-test";
        fsw.IncludeSubdirectories = false;
        fsw.NotifyFilter = NotifyFilters.FileName;
        fsw.Created += new FileSystemEventHandler(fsw_Created_handler);
        fsw.EnableRaisingEvents = true;
        fsw.InternalBufferSize = 32768;
        fsw.Error += fsw_Error_handler;
    }

    private void fsw_Created_handler(object sender, FileSystemEventArgs e)
    {
        new Thread(new ParameterizedThreadStart(work)).Start(e);
    }

    private void fsw_Error_handler(object sender, ErrorEventArgs e)
    {
        EventLog.WriteEntry("few test", e.GetException().Message);
    }

    private void work(object e)
    {
        try
        {
            EventLog.WriteEntry("fsw test", "Queueing File Started");
            Thread.Sleep(10000);
            EventLog.WriteEntry("fsw test", ((FileSystemEventArgs)e).Name);
            EventLog.WriteEntry("fsw test", "Queueing File Done");
        }
        catch (Exception ex)
        {
            EventLog.WriteEntry("fsw test", "Error = " + ex.StackTrace + " *** " + ex.ToString());
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        for (int i = 1; i <= 1000; i++)
        {
            System.IO.File.Create(@"C:\temp\fsw-test\" + i);
        }
    }

Редактировать 2 Стресс-тестирование программы несколькими способами и проверка кода снова и снова не выявили проблем.Так что сейчас это невоспроизводимая ошибка, я внесу несколько изменений, чтобы она чаще регистрировалась и отслеживала ситуацию.

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

События файла не ставятся в очередь. Если вы обрабатываете файл, и создаются новые файлы, вы пропустите события.

Один из способов обойти это, когда происходит новое файловое событие, работает с файлом и, прежде чем вернуться, проверяет наличие новых файлов. Цикл, пока не осталось файлов.

0 голосов
/ 11 марта 2012

Проблема оказалась в повреждении Queue, вызванном многопоточностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...