2011-02-17 124 views
14

我已经抛出了以下异常.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框架的事件处理程序。应用程序本身不会进行任何PostMessage调用。

回答

2

一种特定类型的过程可以分配的Windows资源的量技术上仅由虚拟内存可用的过程的量的限制。这可能是一个相当大的数字,尤其是在64位版本的Windows上。其中一些资源从内部堆中撤出,所有其他进程也从中退出。如果Windows让一个进程占用一切,那么仍然是一个非常大的数字。

哪一个当然没有意义,应该永远不允许一个进程吞噬所有可用的资源。配额的作用是设置某个类型的资源数量的上限。常见的例子有10,000个窗口,10,000个GDI对象,10,000个句柄。并不是所有的人都喜欢这个顺便说一句。

需要了解更多关于PostMessage()调用的内容,但合理的推测是它将消息队列大小推过配额。同样,技术上只限于可用虚拟内存大小的资源。但实际上应该保持在那以南。如果准确,您发布消息的速度比消耗速度快,因此需要进行调节。这发生在您的程序终止时的确切表明另一种解释可能是必要的。线程关机顺序问题,也许。

0

它可能是NTFS配额。欲了解更多信息,请参阅http://technet.microsoft.com/en-us/library/cc786220(WS.10).aspx

+0

我不认为是这样。没有用户机器应该配置NTFS配额。 – sackoverflow 2011-02-17 17:23:11

+0

不要低估组策略,网络存储和/或Citrix和终端服务器的普遍性。 – 2011-02-17 17:32:00

+0

谢谢我不会,但因为我找不到任何配额启用的证据 - 我必须假设异常和NTFS配额(除配额之外没有任何关联) – sackoverflow 2011-02-17 17:39:21

0

solution from here is

我的解决办法是进入控制面板>离线文件和增加的可用磁盘空间量一般都脱机文件和临时空间(为了简单起见,我增加了与我需要移动的文件数量相同的数量,但可能少的文件数量会增加)。

+0

谢谢,我已经发现technet的帖子,但打折,因为该应用程序不会试图同步任何文件和脱机文件在用户计算机上按组策略禁用。 – sackoverflow 2011-02-17 17:45:28

4

Windows 2000/XP:每条消息 队列的发布消息数量限制为10,000条。这个限制应该足够大。如果您的申请超过 的限制,则应重新设计以避免消耗如此多的系统资源。要调整此限制,请修改以下注册表项。

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

最小可接受值是4000。

相关问题