【问题标题】:What 'quota' is being referred to in this exception message: Not enough quota is available to process this command此异常消息中引用了什么“配额”:没有足够的配额可用于处理此命令
【发布时间】:2011-02-17 17:18:54
【问题描述】:

我有一个抛出以下异常的 .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 上,异常不在 my 代码中,而是在 .NET Framework 事件中某种处理程序。应用程序本身不进行任何 PostMessage 调用。

【问题讨论】:

    标签: .net windows exception c#-2.0


    【解决方案1】:

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

    这当然没有意义,绝不应允许进程吞噬所有可用资源。这就是配额的作用,它为某种类型的资源的计数数量设置了上限。常见的例子是 10,000 个窗口、10,000 个 GDI 对象、10,000 个句柄。顺便说一句,并非所有这些都是不错的整数。

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

    【讨论】:

    • 因此配额是(可能)消息队列大小的每个进程限制。我想我的下一个问题是我如何发现队列变得如此之大的原因,我想是另一个帖子。
    • 我相信我的回答更准确,Hans 建议这是一个消息 queue 问题,但我认为这是一个 10,000 条消息发送限制。所以要绕过这个,要么发送更少的消息,增加这个限制的注册表值,要么在异常时重新启动你的消息队列。请参阅msdn.microsoft.com/en-us/library/ms644944(VS.85).aspx 了解更多信息。
    • @servermafail,感谢您的帮助。澄清一下 - 我的代码不发送任何消息,如果您查看堆栈跟踪,您可以看到它是 .NET 框架代码在(appdomain?)关闭时调用 PostMessage。应用程序没有显式调用 PostMessage 或 HandleShutdown。该应用程序在数百台机器上运行,更改注册表设置并不是其中任何一台机器的真正选项。
    • 这个答案对我没有帮助;我的调用堆栈也完全由 .NET 框架代码组成。所以 WPF 被设计破坏了?
    • 是的,这很有帮助。我发现我们不小心向 SynchronizationContext 发布了 13,000 次,这导致了这个确切的错误。
    【解决方案2】:

    According to MSDN:

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

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

    可接受的最小值为 4000。

    【讨论】:

    • 这对我有用,我们的应用程序没有任何改变... 集市上的事情是,同事的电脑具有 win 8 和相同的限制,屏幕工作正常,但在我的 win 8.1 上却没有t...
    【解决方案3】:

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

    【讨论】:

    • 我不这么认为。任何用户计算机都不应配置 NTFS 配额。
    • 不要低估组策略、网络存储和/或 Citrix 和终端服务器的普遍性。
    • 谢谢 我不会,但是因为我找不到任何启用配额的证据 - 我必须假设异常和 NTFS 配额之间没有联系(除了单词配额!)
    【解决方案4】:

    solution from here is:

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

    【讨论】:

    • 谢谢,我已经找到了 technet 的帖子,但是因为该应用程序不会尝试同步任何文件,并且离线文件在用户机器上被组策略禁用,所以我已经找到了它。
    猜你喜欢
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2021-04-20
    相关资源
    最近更新 更多