首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“超额”Win32Exception的诊断

“超额”Win32Exception的诊断
EN

Stack Overflow用户
提问于 2012-04-10 10:25:49
回答 2查看 6.6K关注 0票数 6

大多数情况下,作为一个.Net开发人员,我们可以自由地在我们的高抽象世界中乱搞,但有时现实会让你在私下里发现一个真正理解的人。

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

  • Win2008服务器
  • 64位环境
  • 由多个客户同时使用的WPF应用程序
  • 应用程序是一个启动程序,它使用Process.Start()打开其他应用程序
  • 偶尔我们会得到下面列出的异常

(0x80004005):在MS.Win32.UnsafeNativeMethods.PostMessage(HandleRef hwnd,WindowMessage msg,IntPtr wParam,IntPtr lParam ( System.Windows.Interop.HwndTarget.UpdateWindowSettings(Boolean enableRenderTarget ),Nullable`1‘1 channelSet( System.Windows.Interop.HwndTarget.UpdateWindowPos(IntPtr lparam),System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg,IntPtr wparam,IntPtr lParam),System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd,Int32 msg,IntPtr wparam,IntPtr,System.ComponentModel.Win32Exception (0x80004005)没有足够的配额处理此命令。在MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o的MS.Win32.HwndWrapper.WndProc(IntPtr hwnd,Int32 msg,IntPtr wParam,IntPtr lParam,Boolean& handled),MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object源的对象args,Int32 numArgs),代理方法,对象args,Int32 numArgs,代理catchHandler)

经过一些检查后,编辑#1,下面是更详细的内容:

  • 启动是一个两步进程,启动程序使用Process.WaitForExit()启动一个中间窗口。
  • 从中间窗口,可以以同样的方式启动进一步的进程(Process.WaitForExit)。
  • 在只打开中间窗口且没有用户交互的情况下,启动程序进程的句柄数量随着时间的推移而增加。我们在这里看到的最大增幅是400 -> 6000把手。

编辑中添加的事实确实让我怀疑框架中是否存在句柄泄漏。我试图隔离这个问题,并检查是否可以从头开始复制它。同时,任何暗示、想法、支持甚至巧克力都会被欣然接受!

编辑#2:为了使流程响应于PostMessage(),我们删除了Thread.WaitForExit。相反,我们为进程的退出事件添加了一个Handler,并将启动程序发送到一个循环中,如下所示:

代码语言:javascript
复制
       while (foo == true)
        {
            System.Threading.Thread.Sleep(1000);
        }

Exited将foo设置为false,而不执行其他操作。尽管如此,手柄的数量仍在增加(半小时内有400到800个)。

最后,编辑#3带来了一些有趣的东西。

代码语言:javascript
复制
       while (foo == true)
        {
            System.Threading.Thread.Sleep(1000);
            GC.Collect();
        }

这让它保持了原来的样子,几乎没有手柄,都很漂亮。现在我想知道这里出了什么问题.我会再和负责的开发人员谈谈,看看发射器还做了些什么。到目前为止,我听说它使用XmlDocument.Load()读取了一些配置值,这不是一个IDisposable,这使得在这里很难产生任何泄漏.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-11 21:05:56

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

票数 6
EN

Stack Overflow用户

发布于 2018-07-06 19:59:01

我知道这个问题已经有六年了,但我们刚刚也遇到了同样的问题,我用这个来启发我们。不过,我不喜欢的是睡眠线程和循环的想法。

相反,我创建了一个WPF窗口。使它透明,一个像素高和宽,并增加了一个公共属性的类型进程。

然后,我没有调用.WaitForExit,而是编写了一个共享子(对不起,我使用的是VB.NET术语),它执行以下操作

代码语言:javascript
复制
Public Shared Sub DoWaitForProcessToExit(ByVal poProc As Process, ByVal oOwner As Window)
    Dim oWFE As WaitForProcessToExit
    poProc.EnableRaisingEvents = True
    oWFE = New WaitForProcessToExit
    oWFE.oProc = poProc
    If Not oOwner Is Nothing Then
        oWFE.Owner = oOwner
    End If
    oWFE.ShowDialog()
    oWFE = Nothing
End Sub

万一发生了一些疯狂的事情,并且在激活此对话框时,该进程已经退出:

代码语言:javascript
复制
Private Sub WaitForProcessToExit_Activated(sender As Object, e As EventArgs) Handles Me.Activated

    Try
        If oProc.HasExited Then
            Try
                RemoveHandler oProc.Exited, AddressOf oProc_Exited
            Catch ex As Exception

            End Try
            'whatever happened .... it seems to have gone too quick for this to invoke the _Exited event
            Me.Close()
        End If
    Catch
        Try
            Try
                RemoveHandler oProc.Exited, AddressOf oProc_Exited
            Catch ex As Exception

            End Try
            Me.Close()
        Catch

        End Try
    End Try
End Sub

现在,我只需要在加载对话框时这样做:

代码语言:javascript
复制
Private Sub WaitForProcessToExit_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

    AddHandler oProc.Exited, AddressOf oProc_Exited

End Sub

然后对退出的事件做出回应。没有睡眠,没有循环。

代码语言:javascript
复制
Private Sub oProc_Exited(sender As Object, e As EventArgs)

    'This event is raised by the exiting process, which is in a different thread, so, invoke my own
    'close method from my own Dispatcher
    Windows.Application.Current.Dispatcher.Invoke(Sub() CloseMe(), Windows.Threading.DispatcherPriority.Render)

End Sub

Private Sub CloseMe()

    Me.Close()

End Sub
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10086985

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档