2011-02-17 36 views
14

Tengo una aplicación .NET que desencadena la siguiente excepción:'cuota' se hace referencia en este mensaje de excepción: No hay suficiente cuota está disponible para procesar este comando

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) 

No puedo reproducir este excepción personalmente, pero recibo muchos informes de excepción de los usuarios.

¿A qué se refiere la 'cuota'? El seguimiento de la pila me lleva a pensar que podría ser un problema con la cola de mensajes de Windows.

Cualquier idea sobre qué podría causar este error, o cómo solucionarlo sería muy apreciada.

EDITAR, más información: Se trata de 32 bits de Windows XP en todas las máquinas, y la excepción no está en mi código como tal, sino un controlador de eventos de .NET Framework de algún tipo. La aplicación en sí misma no realiza ninguna llamada de PostMessage.

Respuesta

2

La cantidad de recursos de Windows de un tipo específico de que un proceso podría asignar solamente es técnicamente limitado por la cantidad de memoria virtual disponible para un proceso. Que puede ser un número bastante grande, especialmente en la versión de 64 bits de Windows. Algunos de estos recursos se retiran de un montón interno del cual también se retiran todos los demás procesos. Todavía un número muy grande si Windows deja que un proceso lo consuma todo.

Lo cual, por supuesto, no tiene sentido, nunca se debe permitir que un proceso devore todos los recursos disponibles. Que es lo que hace una cuota, establece un límite superior para el número de recursos contados de un cierto tipo. Ejemplos comunes son 10,000 ventanas, 10,000 objetos GDI, 10,000 mangos. No todos son buenos números redondos como este por cierto.

Tomaría saber más acerca de lo que hace su llamada PostMessage(), pero una suposición razonable es que está empujando el tamaño de la cola de mensajes más allá de la cuota. Nuevamente, un recurso que técnicamente está limitado al tamaño de la memoria virtual disponible. Pero prácticamente debería mantenerse al sur de eso. Si es preciso, está publicando mensajes más rápido de lo que pueden consumirse, se requiere regulación. Que esto ocurra en el exacto vez que su programa está finalizando sugiere que podría ser necesaria otra explicación. Un problema de orden de cierre de hilo, tal vez.

+0

Por lo tanto, la cuota es un límite por proceso en (presumiblemente) el tamaño de la cola de mensajes. Supongo que mi siguiente pregunta es ¿cómo puedo descubrir por qué la cola se está haciendo tan grande, una para otra publicación, supongo? – sackoverflow

+1

Creo que mi respuesta es más precisa, Hans sugiere que este es un mensaje ** cola **, pero creo que es un límite de 10,000 mensajes enviados. Por lo tanto, para eludir esto, envíe mucho menos mensajes, aumente el valor de registro para este límite o reinicie su cola de mensajes en caso de excepción. Consulte http://msdn.microsoft.com/en-us/library/ms644944(VS.85).aspx para obtener más información. – servermanfail

+0

@servermafail, gracias por la ayuda. Para aclarar: mi código no envía ningún mensaje, si observa el seguimiento de la pila, puede ver que se trata de un código de .NET Framework que hace que la llamada PostMessage se cierre (appdomain?). La aplicación no llama explícitamente a PostMessage ni a HandleShutdown. La aplicación se ejecuta en cientos de máquinas, alterar la configuración del registro no es realmente una opción en ninguna de ellas. – sackoverflow

0

Podría ser cuotas NTFS. Para obtener más información, consulte http://technet.microsoft.com/en-us/library/cc786220(WS.10).aspx

+0

No creo que sea eso. Ninguna de las máquinas de los usuarios debe tener cuotas NTFS configuradas. – sackoverflow

+0

No subestime la omnipresencia de las Políticas de grupo, el Almacenamiento de red y/o Citrix y el Servidor de terminales. –

+0

Gracias, no lo haré, pero como no puedo encontrar ninguna evidencia de que las cuotas estén habilitadas, tengo que asumir que no existe un vínculo entre la excepción y las cuotas NTFS (¡excepto la palabra cuota!) – sackoverflow

0

El solution from here is:

Mi solución fue ir a Panel de control> Archivos sin conexión y aumentar la cantidad de espacio en disco disponible para ambos archivos sin conexión en general y el espacio temporal (por En aras de la simplicidad, la aumenté en la misma cantidad de archivos que necesitaba para mover, pero probablemente lo hubiera hecho menos).

+0

Gracias, ya encontré technet post, pero lo descontó porque la aplicación no intenta sincronizar ningún archivo y los archivos fuera de línea están deshabilitados en las máquinas de los usuarios por política de grupo. – sackoverflow

4

Windows 2000/XP: Hay un límite de 10.000 mensajes publicados por mensaje cola. Este límite debe ser lo suficientemente grande. Si su aplicación excede el límite de , debe rediseñarse para evitar consumir tantos recursos del sistema . Para ajustar este límite, modifique la siguiente clave de registro.

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

El valor mínimo aceptable es 4000.

+1

Esto funcionó para mí, nada ha cambiado en nuestra aplicación ... Lo del bazar es que una PC de compañeros de trabajo con win 8 y el mismo límite, la pantalla funciona bien, pero en la mía ganó 8.1 no ... –

+1

Así como copiar/pegar textualmente desde la [página de MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644944 (v = vs.85) .aspx) ¿Por qué no vincularlo también? Tiene otra información útil – Basic

Cuestiones relacionadas