.net 什么';配额';此异常消息中引用了:没有足够的配额可用于处理此命令

.net 什么';配额';此异常消息中引用了:没有足够的配额可用于处理此命令,.net,windows,exception,c#-2.0,.net,Windows,Exception,C# 2.0,我有一个.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.ManagedWndProcTr

我有一个.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调用。

它可能是NTFS配额。有关更多信息,请参见:

我的解决方案是转到“控制面板”>“脱机文件”,增加脱机文件和临时空间的可用磁盘空间(为了简单起见,我增加了与需要移动的文件数量相同的磁盘空间,但可能会减少)


进程可以分配的特定类型的Windows资源量在技术上仅受进程可用虚拟内存量的限制。这可能是一个相当大的数字,尤其是在64位版本的Windows上。其中一些资源从内部堆中提取,所有其他进程也从内部堆中提取。如果Windows允许一个进程将其全部消耗,那么这仍然是一个非常大的数字

当然,这是没有意义的,一个进程永远不应该被允许占用所有可用的资源。配额就是这样做的,它为某一类型的资源数量设置了上限。常见的例子有10000个窗口、10000个GDI对象、10000个句柄。顺便说一句,并不是所有的数字都是这样的整数

需要更多地了解PostMessage()调用的作用,但合理的猜测是它正在将消息队列大小推过配额。同样,技术上仅限于可用虚拟内存大小的资源。但实际上,我们应该保持在南部。如果准确的话,您发布消息的速度超过了它们可以被使用的速度,则需要进行限制。这种情况发生在程序终止的确切时间,这表明可能需要另一种解释。可能是线程关闭顺序问题。

每封邮件最多可发送10000封邮件 队列该限制应足够大。如果您的应用程序超过 限制,它应该重新设计,以避免消耗如此多的系统 资源。要调整此限制,请修改以下注册表项

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

最小可接受值为4000

我想不是那样的。所有用户计算机都不应配置NTFS配额。不要低估组策略、网络存储和/或Citrix和终端服务器的普遍性。谢谢,我不会,但因为我找不到任何证据表明配额已启用-我必须假设异常与NTFS配额(配额一词除外!)之间没有任何联系,谢谢,我已经发现了technet post,但打折了它,因为该应用程序不尝试同步任何文件,并且根据组策略,用户计算机上的脱机文件被禁用。因此配额是每个进程对(大概)消息队列大小的限制。我想我的下一个问题是,我如何发现为什么队列越来越大,我想是一个接一个。我相信我的答案更准确,Hans认为这是一个消息队列问题,但我认为这是一个10000条消息发送的限制。因此,若要绕过此限制,请发送少得多的消息,增加此限制的注册表值,或者在出现异常时重新启动消息队列。有关详细信息,请参阅。@servermafail,谢谢帮助。澄清一下-我的代码不发送任何消息,如果您查看堆栈跟踪,您可以看到是.NET framework代码在关闭(appdomain?)时发出PostMessage调用。应用程序不显式调用PostMessage或HandleShutdown。该应用程序在数百台机器上运行,更改注册表设置在任何机器上都不是一个真正的选项;我的调用堆栈也纯粹由.NET framework代码组成。所以WPF被设计破坏了?这对我来说很有效,我们的应用程序没有任何改变。。。集市的事情是,一个同事的个人电脑与赢8和相同的限制,屏幕工作正常,但在我的赢8.1它不。。。