Какую "квоту" ссылается в этом сообщении об исключении: недостаточно информации о квоте для обработки этой команды
У меня есть приложение .NET, которое выдает следующее исключение:
System.ComponentModel.Win32Exception : Not enough quota is available to process this command
at MS.Win32.UnsafeNativeMethods.PostMessage(HandleRef hwnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at MS.Win32.ManagedWndProcTracker.HookUpDefWindowProc(IntPtr hwnd)
at MS.Win32.ManagedWndProcTracker.OnAppDomainProcessExit()
at MS.Win32.ManagedWndProcTracker.ManagedWndProcTrackerShutDownListener.OnShutDown(Object target)
at MS.Internal.ShutDownListener.HandleShutDown(Object sender, EventArgs e)
Я не могу воспроизвести это исключение лично, но я получаю множество отчетов об исключениях от пользователей.
На что ссылается "квота"? Трассировка стека приводит меня к мысли, что это может быть проблемой в очереди сообщений Windows.
Любые идеи о том, что может вызвать эту ошибку, или как ее исправить, будут очень признательны.
EDIT, дополнительная информация:. Это 32-разрядная версия Windows XP на всех компьютерах, и исключение не входит в мой код как таковой, но какой-то обработчик событий .NET Framework. Само приложение не вызывает никаких вызовов PostMessage.
Ответы
Ответ 1
Объем ресурсов Windows определенного типа, который может выделяться процессом, технически ограничивается объемом виртуальной памяти, доступной для процесса. Который может быть довольно большим числом, особенно в 64-битной версии Windows. Некоторые из этих ресурсов изымаются из внутренней кучи, из которой все другие процессы также отключаются. Все еще очень большое число, если Windows разрешит одному процессу все это.
Что, конечно, не имеет смысла, процесс никогда не должен позволять сожрать все доступные ресурсы. Это то, что делает квота, она устанавливает верхний предел подсчитанному количеству ресурсов определенного типа. Обычными примерами являются 10 000 окон, 10 000 объектов GDI, 10 000 дескрипторов. Не все из них являются хорошими круглыми номерами, подобными этому.
Требуется больше узнать о том, что делает ваш вызов PostMessage(), но разумно предположить, что он толкает размер очереди сообщений за пределы квоты. Опять же, ресурс, который технически ограничивается только размером доступной виртуальной памяти. Но практически должен оставаться на юге от этого. Если вы точны, вы отправляете сообщения быстрее, чем их можно потреблять, требуется дросселирование. Что это происходит в то время, когда заканчивается ваша программа, может потребоваться другое объяснение. Возможно, проблема с остановкой потока.
Ответ 2
Windows 2000/XP: существует ограничение на 10 000 отправленных сообщений на сообщение
очередь. Этот предел должен быть достаточно большим. Если ваша заявка превышает
предел, он должен быть переработан, чтобы избежать потребления столь многих систем
Ресурсы. Чтобы настроить этот предел, измените следующий раздел реестра.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit
Минимально допустимое значение - 4000.
Ответ 3
Это могут быть квоты NTFS. Для получения дополнительной информации см. http://technet.microsoft.com/en-us/library/cc786220(WS.10).aspx
Ответ 4
Решение отсюда:
Мое решение состояло в том, чтобы перейти в Панель управления > Автономные файлы и увеличить объем дискового пространства, доступного как для автономных файлов в целом, так и для временного пространства (для простоты я увеличил его на столько же количества файлы, которые мне нужно было перемещать, но меньше, возможно, сделали бы).