【问题标题】:Win32Exception: Operation completed successfullyWin32Exception:操作成功完成
【发布时间】:2012-01-17 22:11:14
【问题描述】:

以下代码因异常而崩溃:

MyWindow wnd = new MyWindow();
wnd.Show(); //here an exception occurs

异常很奇怪,但据我了解,它是 .net 中的一个错误

System.ComponentModel.Win32Exception (0x80004005): The operation completed successfully
   at MS.Win32.UnsafeNativeMethods.GetDC(HandleRef hWnd)
   at System.Windows.Interop.HwndTarget..ctor(IntPtr hwnd)
   at System.Windows.Interop.HwndSource.Initialize(HwndSourceParameters parameters)
   at System.Windows.Interop.HwndSource..ctor(HwndSourceParameters parameters)
   at System.Windows.Window.CreateSourceWindow(Boolean duringShow)
   at System.Windows.Window.CreateSourceWindowDuringShow()
   at System.Windows.Window.SafeCreateWindowDuringShow()
   at System.Windows.Window.ShowHelper(Object booleanBox)
   at System.Windows.Window.Show()

MyWindow 对象是一个窗口,里面有一些矢量图形,但不会太多。此外,当已经打开和关闭了 10-20 个 MyWindow 对象时会发生这种情况。

解决方案:原因是 GDI 对象泄漏。它们在我的低级代码中创建包含错误。因此,问题与 MyWindow 对象无关。

【问题讨论】:

  • 如果你不是从主线程创建窗口,你可能有太多的Dispatchers活着。尝试遵循建议的解决方法on Connect issue。可能你的 windows 消耗了太多资源。
  • 在MyWindow的构造函数中做了什么?你重写了 show 方法吗?
  • @rekire 不,我不覆盖。构造函数中唯一的行是 InitializeComponent()
  • 我有同样的问题,但在不同的环境中。注意到@rekire 提到了 Show() 方法。因为我在做 MVVM,所以我在 App.xaml.cs 中覆盖 Startup() 并在其中使用 window.Show()。当我尝试使用处理程序进行 BluetoothWin32Authentication 时,这是否可能导致问题?
  • 我实际上是我在一个新项目中的一个班轮,只有一个按钮,没有 MVVM,什么都没有。仍然得到同样的错误。

标签: c# wpf exception


【解决方案1】:

它不会轰炸winapi错误代码,实际错误代码是E_FAIL,一个COM错误代码。这对诊断任何事情都非常无益,它仅意味着“无法做到,不知道为什么”。 GetDC() 是如何产生该错误代码的很难猜测,我怀疑它是与 winapi 函数挂钩的环境问题。也许类似于远程桌面或屏幕录像机。请尝试在另一台机器上运行它。

GetDC() 失败的“正常”原因是句柄泄漏。当 Windows 已经消耗了 10,000 个句柄时,它会停止为进程提供更多句柄。您可以使用 TaskMgr.exe 的“进程”选项卡进行诊断。查看 + 选择列并勾选句柄、用户对象和 GDI 对象。首先检查进程列表并确认您没有消耗大量进程的进程。会话中所有进程的 GDI 对象总数受会话池大小的限制。接下来运行您的程序并密切关注您的进程的值。

【讨论】:

  • 为什么 GC 不处理句柄?为什么直到 Handles 数量达到 10k 才执行 GC?
  • 管理句柄不是 GC 的工作,它只管理内存。 finalizer 负责释放句柄。当程序没有足够快地运行并且程序员忽略了 Dispose() 方法时,程序会失败。
【解决方案2】:

我们的项目也有这个问题...

我们将所有视图和视图模型堆叠起来,然后一一显示。 解决方案是一个一个地显示元素而不创建堆栈。

【讨论】:

    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多