大部分的工作作为一个.NET开发人员的时间给了我们自由地浪费时间在我们的高级别的抽象世界,但有时现实踢你的私处,并告诉你找到一个男人谁真正理解。
我刚刚的这些经验之一。 我认为这将足以列出角落的数据作为一个项目列表让你了解我们在这里:
- 的Win2008服务器
- 64位环境
- 同时被多个客户使用WPF应用程序
- 应用程序是一个发射器,打开使用的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
。 相反,我们增加了对过程的已退出事件的处理程序和发送的启动到像下面这样的循环:
while (foo == true)
{
System.Threading.Thread.Sleep(1000);
}
已退出处理程序设置foo
为false,并没有别的。 仍然,柄的数量的增加(400到800在半小时内)。
编辑#3来了一些有趣的事情,在最后。
while (foo == true)
{
System.Threading.Thread.Sleep(1000);
GC.Collect();
}
这使得它,它应该是,几个把手,所有漂亮的方式。 现在,让我不知道什么是错在这里...我会再跟负责开发人员回来检查发射做什么。 到目前为止,我听说它读取使用一些配置值XMLDocument.load方法() ,这是不是一个IDisposable
-使得一种很难在这里产生任何泄漏...