0

我的应用程序 WPF C#.NET 3.5 VS2008 在一台客户机器上遇到了一些问题。我的 App 在不同的 Windows 机器(XP、Vista 32/64、Win7 32/64)上安装了近 1000 次,到目前为止没有问题。

Win7 32 PC 上似乎只有一个有问题。

取决于当前活动的任务管理器概述:

1 - 活动:程序已启动

http://i.stack.imgur.com/jA6j7.gif(见图)

2 - 活动:简单点击菜单项、按钮等

http://i.stack.imgur.com/e0erH.gif(见图)

对象 USER对象 GDI运行到 10'000 并且应用程序抛出以下异常:

System.ComponentModel.Win32Exception The current process has used all of its system allowance of handles for Window Manager objects 

à MS.Win32.UnsafeNativeMethods.CreateWindowEx(Int32 dwExStyle, String lpszClassName, String lpszWindowName, Int32 style, Int32 x, Int32 y, Int32 width, Int32 height, HandleRef hWndParent, HandleRef hMenu, HandleRef hInst, Object pvParam)
   à MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
   à System.Windows.Interop.HwndSource.Initialize(HwndSourceParameters parameters)
   à System.Windows.Interop.HwndSource..ctor(HwndSourceParameters parameters)
   à System.Windows.Window.SetTaskbarStatus()
   à System.Windows.Window.CreateAllStyle()
   à System.Windows.Window.CreateSourceWindowImpl()
   à System.Windows.Window.SafeCreateWindow()
   à System.Windows.Window.ShowHelper(Object booleanBox)
   à System.Windows.Window.Show()
   à System.Windows.Window.ShowDialog()
   à WPFControls.WPFMessageBox.Show(String title, String message, String details, WPFMessageBoxButtons buttonOption, WPFMessageBoxImage image)
   à MyApp.Prolog.Application_DispatcherUnhandledException(Object sender, DispatcherUnhandledExceptionEventArgs e)
   à System.Windows.Threading.Dispatcher.CatchException(Exception e)
   à System.Windows.Threading.Dispatcher.CatchExceptionStatic(Object source, Exception e)
   à System.Windows.Threading.ExceptionWrapper.CatchException(Object source, Exception e, Delegate catchHandler)
   à System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   à System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   à System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
   à System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
   à MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   à MS.Win32.UnsafeNativeMethods.SetWindowPos(HandleRef hWnd, HandleRef hWndInsertAfter, Int32 x, Int32 y, Int32 cx, Int32 cy, Int32 flags)
   à System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight)
   à System.Windows.Window.CreateSourceWindowImpl()
   à System.Windows.Window.SafeCreateWindow()
   à System.Windows.Window.ShowHelper(Object booleanBox)
   à System.Windows.Window.Show()
   à System.Windows.Window.ShowDialog()
   à WPFControls.WPFMessageBox.Show(String title, String message, String details, WPFMessageBoxButtons buttonOption, WPFMessageBoxImage image)
   à MyApp.Prolog.Application_DispatcherUnhandledException(Object sender, DispatcherUnhandledExceptionEventArgs e)
   à System.Windows.Threading.Dispatcher.CatchException(Exception e)
   à System.Windows.Threading.Dispatcher.CatchExceptionStatic(Object source, Exception e)
   à System.Windows.Threading.ExceptionWrapper.CatchException(Object source, Exception e, Delegate catchHandler)
   à System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   à System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   à System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
   à System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
   à MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   à MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   à System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   à System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   à System.Windows.Window.ShowHelper(Object booleanBox)
   à System.Windows.Window.Show()
   à System.Windows.Window.ShowDialog()
   à MyApp.Prolog.Prolog_Startup(Object sender, StartupEventArgs e) 0 0 0

请问有人可以帮忙吗?


更新 - 编辑

我们的客户确实设置了一个新的干净(如他所说)Win 7 64 OS,但问题仍然存在。使用 WPF 应用程序似乎无法正常工作。

我还尝试在客户机器上使用 John Smith 的这篇文章 (msdn.microsoft.com/de-de/magazine/dd419663.aspx) 的 MVVM 演示应用程序。

当我尝试单击菜单项、按钮或在下拉列表中选择某些内容时,MVVM 演示应用程序也会崩溃。在文本字段中输入文本是可以的,但单击并选择确实会停止 MVVM 演示应用程序,并显示应用程序无法运行的错误。

这是我的应用程序的事件日志

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
    - <System>
        <Provider Name="Application Error" />
        <EventID Qualifiers="0">1000</EventID>
        <Level>2</Level>
        <Task>100</Task>
        <Keywords>0x80000000000000</Keywords>
        <TimeCreated SystemTime="2013-02-07T11:04:13.000000000Z" />
        <EventRecordID>2243</EventRecordID>
        <Channel>Application</Channel>
        <Computer>RSSec.Machine.local</Computer>
        <Security />
    </System>
    - <EventData>
        <Data>MyApp.exe</Data>
        <Data>2.0.16.0</Data>
        <Data>51136bd8</Data>
        <Data>unknown</Data>
        <Data>0.0.0.0</Data>
        <Data>00000000</Data>
        <Data>c000041d</Data>
        <Data>74494f0d</Data>
        <Data>ecc</Data>
        <Data>01ce0522d9d3bc67</Data>
        <Data>C:\Program Files (x86)\MyApp\MyApp.exe</Data>
        <Data>unknown</Data>
        <Data>1ad6d91f-7116-11e2-87c7-10604b689bfe</Data>
    </EventData>
</Event>

有人可以再帮忙吗?谢谢

4

2 回答 2

4

从堆栈跟踪中可以看出,您的代码中至少存在一个问题。您已经为 Dispatcher.UnhandledException 事件编写了事件处理程序,并使用消息框显示了异常。如果此消息框已显示,您不要确保避免这样做。从跟踪中多次出现 MyApp.Prolog.Application_DispatcherUnhandledException() 可见。

所以这里有一些可能性,用户正在查看充满一万个消息框的屏幕。之后,当 Windows 拒绝允许您的程序再创建时,它拔掉了插头。

您还不知道真正的异常是什么样的。但它很可能是一些粗俗的东西,当调度程序循环运行时,它会一遍又一遍地抛出。您需要改进未处理的异常处理以获得崩溃的真正原因。 添加一个 bool 标志,指示显示消息框,并在 UnhandledException 再次触发并将标志设置为 true 时终止程序并记录异常,这样您就可以找出引发了什么,而无需用户回读消息框所说的内容。

于 2013-01-30T12:36:16.297 回答
1

每个 Windows 平台都有一些句柄限制。较旧的有时甚至低至〜16000。较旧的甚至在屏幕上每 1 个控件(文本框、按钮)消耗 1 个句柄。较旧的有时甚至没有检查有时只打开一半窗口时出现的奇怪行为的限制。但是在任何地方,任何地方,它总是两件事之一:您的应用程序过于贪婪,只是因为错误UI 设计(只需尝试在 WinForms 中显示一个没有虚拟化的中继器,其中包含 100'000 行和一个按钮/文本编辑器!),或者您的应用程序通过正确地不释放 UI/IO/etc 项目而泄露了句柄。或者您尝试一次打开数百万个文件,但这很明显而且不太可能。

无论如何,异常说句柄到窗口管理器,所以它是关于 UI 的。

诊断哪些句柄泄漏的最快方法可能是从 MSDN 获取 ProcessExplorer 或从 SourceForge 获取 ProcessHacker2 之类的程序,并尝试检查崩溃前发生的情况。

上述应用程序不仅允许您查看任何应用程序当前打开了哪些句柄(在这里您可以了解挂起的 I/O、互斥锁等),还可以检查当前的 Window 层次结构(在那里您可能会了解哪些窗口/controls 没有被释放,或者哪些是不必要地创建的)。我说也许吧,因为它是非常特定于应用程序的。在某些情况下,使用 Proceshacker,您会确切地看到您的“添加评论”窗口在 10000 个实例中打开,但在其他情况下,您只会听到“一个窗口”的 10000 个句柄挂起,这并不能告诉您太多。

当然,这才刚刚开始。然后你必须找到并解决原因。但至少这是一个开始,你会知道在哪里进一步寻找。

于 2013-01-30T11:04:53.160 回答