c # service «Достигнут предел команды netwerk bios», почему и какое решение лучше? - PullRequest
0 голосов
/ 30 января 2012

У меня есть служба, которая открывает несколько наблюдателей для просмотра нескольких папок.После просмотра папок в течение определенного времени я получаю «Достигнут предел сетевой команды 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);
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 30 января 2012

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

watcher = new FileSystemWatcher();

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

0 голосов
/ 30 января 2012

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

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

...