О какой «квоте» говорится в этом сообщении об исключении: Недостаточно квоты для обработки этой команды - PullRequest
18 голосов
/ 17 февраля 2011

У меня есть приложение .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.

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

РЕДАКТИРОВАТЬ, дополнительная информация: Это на 32-битной Windows XP на всех машинах, и исключение составляет не мой код как таковой, а обработчик событий .NET Framework какой-то. Само приложение не выполняет никаких вызовов PostMessage.

Ответы [ 4 ]

6 голосов
/ 17 февраля 2011

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

Что, конечно, не имеет смысла, нельзя допускать, чтобы процесс сожрал все доступные ресурсы. Что и делает квота, она устанавливает верхний предел для подсчитанного количества ресурсов определенного типа. Типичными примерами являются 10 000 окон, 10 000 объектов GDI, 10 000 дескрипторов. Не все из них хорошие круглые числа, как это кстати.

Требуется больше знать о том, что делает ваш вызов PostMessage (), но разумно предположить, что он выталкивает размер очереди сообщений за пределы квоты. Опять же, ресурс, который технически ограничен только размером доступной виртуальной памяти. Но к югу от этого практически не должно остаться. Если сообщения точны, вы отправляете сообщения быстрее, чем они могут быть использованы, регулирование необходимо. То, что это происходит в точное время, когда ваша программа завершает работу, предполагает, что может потребоваться другое объяснение. Возможно, проблема с порядком отключения потока.

5 голосов
/ 17 февраля 2011

Согласно MSDN:

Существует ограничение в 10 000 опубликованных сообщений на одно сообщение. очередь. Этот предел должен быть достаточно большим. Если ваша заявка превышает предел, он должен быть переработан, чтобы избежать потребления так много системы Ресурсы. Чтобы изменить это ограничение, измените следующий раздел реестра.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit

Минимально допустимое значение - 4000.

0 голосов
/ 17 февраля 2011

Отсюда решение :

Моим решением было перейти в Панель управления> Автономные файлы и увеличить объем дискового пространства, доступного как для автономных файлов в целом, так и для временного пространства (для простоты я увеличил его на то же количество файлы, которые мне нужно было переместить, но меньше, вероятно, сделал бы).

0 голосов
/ 17 февраля 2011

Это могут быть квоты NTFS. Для получения дополнительной информации см. http://technet.microsoft.com/en-us/library/cc786220(WS.10).aspx

...