Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FileSystemWatcher и InternalBufferSize 
V
    Опции темы
Experimenter
Дата 21.11.2007, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 8
Всего: 17



Доброго здоровья, уважаемые!

Вот сабж. Есть такое свойство InternalBufferSize, размер должен быть кратным 4096, по умолчанию 8192. Вопрос: что вызовет переполнение буфера? Цитирую МСДН:
Цитата

Система уведомляет этот компонент об изменениях файлов; эти изменения хранятся в созданном этим компонентом буфере и передаются в интерфейсы прикладного программирования (API) Win32. Если в течение короткого времени происходит много изменений, буфер может переполниться. В результате этот компонент не сможет отслеживать изменения в папке и будет давать только общие уведомления. Увеличение размера буфера сопряжено с большими накладными расходами, поскольку он формируется не в выгружаемой памяти и не может быть подкачан с диска, поэтому буфер следует делать как можно меньше. Чтобы устранить переполнение буфера, используйте свойства NotifyFilter и IncludeSubdirectories для фильтрации ненужных уведомлений.

При переполнении внутреннего буфера компонент инициирует событие Error.

Согласитесь, как-то расплывчато. Хочу знать, сколько вешать в граммах, т.е. в течение какого "короткого" времени и сколько это - "много" изменений? И что за уведомления там создаются, имена измененных файлов что ли (либо дескрипторы)?


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
tol05
Дата 21.11.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



вот неплохая статья
Цитата

Your FileSystemWatcher component has the potential to receive an enormous number of events, particularly if you have set it to watch a very high-traffic directory. This can cause problems, as the FileSystemWatcher component can only receive event notifications at a manageable rate. The system notifies the component of file changes, it stores those changes in a buffer the component creates and passes to the Win32 Application Programming Interfaces (APIs). If there are many changes in a short time, the buffer can overflow. This causes the component to lose track of changes in the directory, and it will only provide "blanket" notification and the component will raise an exception. Default size is 4KB, you can increase the buffer size using InternalBufferSize, but increasing the size of the buffer is expensive, as it comes from non-paged memory that cannot be swapped out to disk, so keep the buffer as small as possible. A 4 KB buffer can track changes on approximately 80 files in a directory. Each event takes up 16 bytes in the buffer, plus enough bytes to store the name of the file, in Unicode (2 bytes per character), that the event occurred on. You can use this information to approximate the buffer size you will need.

если ей верить , то уже изменение 80 файлов в директории может вызвать это переполнение. Т.е. если в директорию было добавлено, скажем 100 файлов, то только о 80-ти будет сообщено. О добавлении еще 20-ти ты не узнаешь.


Цитата(Experimenter @  21.11.2007,  07:18 Найти цитируемый пост)
что за уведомления там создаются, имена измененных файлов что ли (либо дескрипторы)? 

FileSystemWatcher имеет метод Monitor
Цитата

private unsafe void Monitor(IntPtr bufferPtr)
{
    if (this.enabled && !this.IsHandleInvalid)
    {
        Overlapped overlapped = new Overlapped();
        if (bufferPtr == IntPtr.Zero)
        {
            try
            {
                bufferPtr = Marshal.AllocHGlobal(this.internalBufferSize);
            }
            catch (OutOfMemoryException)
            {
                throw new OutOfMemoryException(SR.GetString("BufferSizeTooLarge", new object[] { this.internalBufferSize.ToString(CultureInfo.CurrentCulture) }));
            }
        }
        ulong num = (ulong) ((long) bufferPtr);
        overlapped.OffsetHigh = (int) (num >> 0x20);
        overlapped.OffsetLow = (int) num;
        FSWAsyncResult result = new FSWAsyncResult();
        result.session = this.currentSession;
        overlapped.AsyncResult = result;
        NativeOverlapped* overlappedPointer = overlapped.Pack(new IOCompletionCallback(this.CompletionStatusChanged), this.currentSession);
        bool flag = false;
        try
        {
            if (!this.IsHandleInvalid)
            {
                int num2;
                flag = UnsafeNativeMethods.ReadDirectoryChangesW(this.directoryHandle, new HandleRef(this, bufferPtr), this.internalBufferSize, this.includeSubdirectories ? 1 : 0, (int) this.notifyFilters, out num2, overlappedPointer, NativeMethods.NullHandleRef);            }
        }
        catch (ObjectDisposedException)
        {
        }
        catch (ArgumentNullException)
        {
        }
        finally
        {
            if (!flag)
            {
                Overlapped.Free(overlappedPointer);
                Marshal.FreeHGlobal(bufferPtr);
                if (!this.IsHandleInvalid)
                {
                    this.OnError(new ErrorEventArgs(new Win32Exception()));
                }
            }
        }
    }
}

дескрипторами оперирует.
Ну а если есть желание покопать глубже, юзай reflector+www.pinvoke.net+время+терпение
 smile 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Experimenter
Дата 21.11.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 8
Всего: 17



tol05, особенно вот это понравилось:
Цитата

Each event takes up 16 bytes in the buffer, plus enough bytes to store the name of the file, in Unicode (2 bytes per character), that the event occurred on.
Теперь знаю, сколько вешать в граммах!
насчет рефлектора как-то и забыл даже, юзаю, а как же.
Респект тебе и уважуха и плюс в репу.

Это сообщение отредактировал(а) Experimenter - 21.11.2007, 12:28


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Alexsar
Дата 2.6.2008, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: 2
Всего: 1



у меня проблема сродни этой
процесс следит за целевой папкой, в какой то момент объект класса FileSystemWatcher перестаёт обрабатывать событие создания файлов, то есть как будто никаких изменений в целевой директории нет. вопрос что делать? ось - windows 2003 server
PM MAIL   Вверх
Experimenter
Дата 2.6.2008, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 430
Регистрация: 8.5.2007
Где: Уфа

Репутация: 8
Всего: 17



У FileSystemWatcher есть событие Error, которое как раз за переполнение буфера отвечает. Его и используй, перезапускай поток, либо еще что-то...


--------------------
public Zlo FromTwoEvilsChooseSmaller(Zlo zlo1, Zlo zlo2){
    if(zlo1 < zlo2) return zlo1;
    else if(zlo1 > zlo2) return zlo2;
    else throw new Exception("Kill yourself by the wall"); }
PM WWW ICQ   Вверх
Alexsar
Дата 3.6.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 6.5.2005

Репутация: 2
Всего: 1



to Experimenter
ок, понял
попробуем
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.