gpt4 book ai didi

.net - 诊断 "Quota Exceeded"Win32Exception

转载 作者:行者123 更新时间:2023-12-02 15:42:29 28 4
gpt4 key购买 nike

大多数时候,作为 .Net 开发人员,我们可以自由地在高级抽象世界中玩耍,但有时现实会踢你的私密部分,并告诉你要找到一个真的理解。

我刚刚经历过其中一次。我认为将角落数据列为项目列表就足够了,以便您了解我们这里的内容:

  • Win2008服务器
  • 64 位环境
  • 多个客户端同时使用的 WPF 应用程序
  • Application 是一个启动器,它使用 Process.Start() 打开其他应用程序
  • 有时我们会遇到下面列出的异常
System.ComponentModel.Win32Exception (0x80004005): Not enough quota is
available to process this command
at MS.Win32.UnsafeNativeMethods.PostMessage(HandleRef hwnd,
WindowMessage msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Interop.HwndTarget.UpdateWindowSettings(Boolean
enableRenderTarget, Nullable`1 channelSet)
at System.Windows.Interop.HwndTarget.UpdateWindowPos(IntPtr lParam)
at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg,
IntPtr wparam, IntPtr lparam)
at System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd,
Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam,
Boolean& handled)
at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate
callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object
source, Delegate method, Object args, Int32 numArgs, Delegate
catchHandler)

编辑#1经过一番检查,这里有更多细节:

  • 启动是一个两步过程,启动器启动一个中间过程使用 Process.WaitForExit() 的窗口

  • 从中间窗口中,可以以相同的方式启动进一步的进程 (Process.WaitForExit)。

  • 在仅打开中间窗口且没有用户交互的情况下,启动器进程的句柄数量会随着时间的推移而增加。我们在这里看到的最大增加是 400 --> 6000 个句柄。

编辑中添加的事实确实让我想知道框架中的某个地方是否可能存在句柄泄漏。我正在尝试隔离问题并检查是否可以从头开始重现它。与此同时,任何形式的暗示、想法、支持甚至巧克力都会被欣然接受!

编辑#2:为了使进程响应 PostMessage(),我们删除了 Thread.WaitForExit。相反,我们为 Process 的 Exited 事件添加了一个处理程序,并将 Launcher 发送到如下循环中:

       while (foo == true)
{
System.Threading.Thread.Sleep(1000);
}

Exited-Handler 将 foo 设置为 false,并且不执行任何其他操作。尽管如此,句柄数量仍在增加(半小时内从 400 个增加到 800 个)。

编辑#3终于来了一些有趣的事情。

       while (foo == true)
{
System.Threading.Thread.Sleep(1000);
GC.Collect();
}

这使它保持了应有的样子,很少有 handle ,一切都很漂亮。现在这让我想知道这里出了什么问题......我将再次与负责的开发人员交谈以检查启动器还做了什么。到目前为止,我听说它使用 XmlDocument.Load() 读取一些配置值。 ,这不是一个 IDisposable - 使得这里很难产生任何泄漏......

最佳答案

该错误告诉您向某个窗口发布消息时,该窗口的消息队列已达到其最大容量。这意味着拥有该窗口的线程处理消息的速度不够快(如果有的话)。

关于.net - 诊断 "Quota Exceeded"Win32Exception,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10086985/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com