Служба c # Ошибка ограничения команды netwerk bios, почему и какое лучшее решение?

У меня есть служба, которая открывает несколько наблюдателей для просмотра нескольких папок. После просмотра папок в течение определенного времени я получаю сообщение «Достигнут предел сетевой команды BIOS».

Как я читал здесь, это вызвано наличием большего количества долгосрочных запросов, чем разрешено.

Я считаю, что это происходит из-за приведенного ниже кода обработки ошибок, который у меня есть, который запускается событием ошибки наблюдателей. Это запускает новый экземпляр наблюдателя, снова вызывая метод WatchFile. Я полагаю, что это оставляет старый, ныне несуществующий наблюдатель, и запускает новый наблюдатель, но я боюсь, что остановка наблюдателя либо предотвратит его повторный запуск, либо остановит все экземпляры на основе наблюдателя.

Или я ошибаюсь и ошибка зависит от количества изменений? Это приведет к одновременному сбросу 100 файлов, что вызовет эту ошибку.

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

private static void watcherError(String directory, Boolean intray, ErrorEventArgs e, FileSystemWatcher watcher)
{
    Exception watchException = e.GetException();
    EventLog.WriteEntry("WhiteFileMover", String.Concat("error gedetecteerd, watcher werd herstart  -  ", watchException.Message), EventLogEntryType.Information);
    watcher = new FileSystemWatcher();
    while (!watcher.EnableRaisingEvents)
    {
        try
        {
            // This will throw an error at the
            // watcher.NotifyFilter line if it can't get the path.
            WatchFile(directory, intray);
        }
        catch(Exception exp)
        {
            // Sleep for a bit; otherwise, it takes a bit of
            // processor time
            EventLog.WriteEntry("WhiteFileMover", String.Concat("Failed to restart watcher, retrying in 5 seconds  -  ", exp.Message), EventLogEntryType.Warning);
            System.Threading.Thread.Sleep(5000);
        }
    }
}

person Andy    schedule 30.01.2012    source источник
comment
как насчет удаления старого наблюдателя, который столкнулся с ошибкой?   -  person Kolja    schedule 30.01.2012
comment
@Kolja, если я сделаю watcher.dispose, будет ли удален только этот экземпляр или все экземпляры на основе наблюдателя? например, я создал 3 экземпляра наблюдателя, но хочу избавиться только от одного из них.   -  person Andy    schedule 30.01.2012
comment
Он удалит текущий экземпляр, на который указывает переменная, который не удалось выполнить. После этого вы можете создать новый экземпляр. Но вы не удаляете его, а просто создаете новый, что, скорее всего, приведет к кучке потраченных впустую экземпляров наблюдателя.   -  person Kolja    schedule 31.01.2012
comment
Андрей, у меня точно такая же проблема. Не могли бы вы поделиться своим решением? Я думаю об использовании одного из двух решений здесь. Либо используйте опрос каталогов, либо напишите пул FSW, чтобы возвращать один объект для тех же корневых каталогов. но я уверен, что у обоих будут свои проблемы. Кроме того, создание пула для FSW вместо создания нескольких FSW только отсрочит проблему, но в конечном итоге я столкнусь с ошибкой Network BIOS, и мне придется перезапустить просмотр.   -  person Patel    schedule 29.06.2017


Ответы (2)


Посмотрите на эту строку:

watcher = new FileSystemWatcher();

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

person Joel Coehoorn    schedule 30.01.2012
comment
Я добавил watcher.dispose перед созданием нового наблюдателя, но ошибка остается прежней. что еще мне нужно сделать, прежде чем старый наблюдатель будет удален из памяти? - person Andy; 31.01.2012
comment
@Andy Dispose() не имеет ничего общего с памятью. К счастью, ваша проблема не в памяти (в отличие от файловых дескрипторов). Но настоящая проблема заключается в том, что вам не следует постоянно создавать нового наблюдателя. Вы хотите использовать ровно один наблюдатель для своего приложения и передавать ссылки на этот единственный экземпляр. - person Joel Coehoorn; 31.01.2012

Почему бы вам не создать файловый наблюдатель и не определить обработчики событий?

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx

person Bill Martin    schedule 30.01.2012