大多数情况下,作为一个.Net开发人员,我们可以自由地在我们的高抽象世界中乱搞,但有时现实会让你在私下里发现一个真正理解的人。
我刚经历过其中一次。我认为将角落数据作为项目列表列出就足够了,您可以了解我们在这里拥有的内容:
(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,下面是更详细的内容:
编辑中添加的事实确实让我怀疑框架中是否存在句柄泄漏。我试图隔离这个问题,并检查是否可以从头开始复制它。同时,任何暗示、想法、支持甚至巧克力都会被欣然接受!
编辑#2:为了使流程响应于PostMessage(),我们删除了Thread.WaitForExit。相反,我们为进程的退出事件添加了一个Handler,并将启动程序发送到一个循环中,如下所示:
while (foo == true)
{
System.Threading.Thread.Sleep(1000);
}Exited将foo设置为false,而不执行其他操作。尽管如此,手柄的数量仍在增加(半小时内有400到800个)。
最后,编辑#3带来了一些有趣的东西。
while (foo == true)
{
System.Threading.Thread.Sleep(1000);
GC.Collect();
}这让它保持了原来的样子,几乎没有手柄,都很漂亮。现在我想知道这里出了什么问题.我会再和负责的开发人员谈谈,看看发射器还做了些什么。到目前为止,我听说它使用XmlDocument.Load()读取了一些配置值,这不是一个IDisposable,这使得在这里很难产生任何泄漏.
发布于 2012-04-11 21:05:56
错误告诉您,在向窗口发送消息时,窗口的消息队列达到了最大容量。这意味着拥有该窗口的线程处理消息的速度不够快,如果有的话。
发布于 2018-07-06 19:59:01
我知道这个问题已经有六年了,但我们刚刚也遇到了同样的问题,我用这个来启发我们。不过,我不喜欢的是睡眠线程和循环的想法。
相反,我创建了一个WPF窗口。使它透明,一个像素高和宽,并增加了一个公共属性的类型进程。
然后,我没有调用.WaitForExit,而是编写了一个共享子(对不起,我使用的是VB.NET术语),它执行以下操作
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万一发生了一些疯狂的事情,并且在激活此对话框时,该进程已经退出:
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现在,我只需要在加载对话框时这样做:
Private Sub WaitForProcessToExit_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
AddHandler oProc.Exited, AddressOf oProc_Exited
End Sub然后对退出的事件做出回应。没有睡眠,没有循环。
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 Subhttps://stackoverflow.com/questions/10086985
复制相似问题