我有一个.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调用。
答案 0 :(得分:6)
进程可能分配的特定类型的Windows资源量在技术上仅受进程可用虚拟内存量的限制。这可能是一个相当大的数字,尤其是在64位版本的Windows上。其中一些资源从内部堆中撤出,所有其他进程也从中撤回。如果Windows允许一个进程全部使用它,那么仍然是一个非常大的数字。
当然没有任何意义,绝不允许流程吞噬所有可用资源。配额的作用是什么,它设定了某种类型的计算资源数量的上限。常见的例子是10,000个窗口,10,000个GDI对象,10,000个句柄。并非所有这些都是很好的圆形数字,比如这个btw。
需要了解更多关于PostMessage()调用的内容,但合理的猜测是它将消息队列大小推过配额。同样,从技术上讲,资源仅限于可用虚拟内存的大小。但实际上应该保持在那个南方。如果准确,您发布的消息速度超过消费速度,则需要进行限制。这种情况发生在程序终止的完全时间,这表明可能需要另外的解释。可能是线程关闭命令问题。
答案 1 :(得分:5)
每条消息的发布消息数限制为10,000 队列。这个限制应该足够大。如果您的申请超过 限制,应重新设计,以避免消耗这么多系统 资源。要调整此限制,请修改以下注册表项。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit
最低可接受值是4000.
答案 2 :(得分:0)
可能是NTFS配额。有关详细信息,请参阅http://technet.microsoft.com/en-us/library/cc786220(WS.10).aspx
答案 3 :(得分:0)
我的解决方案是转到控制面板>脱机文件,并增加一般和临时空间的两个脱机文件可用的磁盘空间量(为了简单起见,我增加了相同数量的磁盘空间我需要移动的文件,但可能会少做。)