sac*_*low 20 .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.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)
Run Code Online (Sandbox Code Playgroud)
我无法亲自重现此异常,但我收到了很多来自用户的异常报告.
提到的"配额"是什么?堆栈跟踪让我相信它可能是Windows消息队列的问题.
任何关于可能导致此错误或如何修复错误的想法都将非常感激.
编辑,进一步信息: 这是在所有机器上的32位Windows XP上,并且异常不在我的代码中,而是某种.NET Framework事件处理程序.应用程序本身不会进行任何PostMessage调用.
进程可以分配的特定类型的Windows资源量在技术上仅受进程可用的虚拟内存量的限制.这可能是一个相当大的数字,尤其是在64位版本的Windows上.其中一些资源从内部堆中撤出,所有其他进程也从中撤回.如果Windows允许一个进程全部使用它,那么仍然是一个非常大的数字.
这当然没有意义,绝不允许流程吞噬所有可用资源.配额的作用是什么,它设定了某种类型的计算资源数量的上限.常见的例子是10,000个窗口,10,000个GDI对象,10,000个句柄.并非所有这些都是很好的圆形数字,比如这个顺便说一下.
需要更多地了解PostMessage()调用的功能,但合理的猜测是它将消息队列大小推过配额.同样,从技术上讲,资源仅限于可用虚拟内存的大小.但实际上应该保持在那个南方.如果准确,您发布的消息速度超过消费速度,则需要进行限制.这发生在您的程序终止的确切时间表明可能需要另一种解释.也许是一个线程关闭命令问题.
Windows 2000/XP:每个消息队列的发布消息数限制为10,000.这个限制应该足够大.如果您的应用程序超出限制,则应重新设计它以避免消耗这么多系统资源.要调整此限制,请修改以下注册表项.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit
Run Code Online (Sandbox Code Playgroud)
最低可接受值为4000.
归档时间: |
|
查看次数: |
12580 次 |
最近记录: |