0

我有一个程序在后台线程中进行一些几何分析。

通常这工作得很好,但令人惊讶的是,当我尝试在我的开发计算机上创建 PathGeometry 时出现异常:

所以在简单的代码上:

PathGeometry geometry = new PathGeometry();

我得到一个 System.TypeInitializationException {"Der Typeninitialisierer für \"System.Windows.Media.PathGeometry\" hat eine Ausnahme verursacht."}
堆栈跟踪是:

bei System.Windows.Media.PathGeometry..ctor()
bei Bsoft.ilka.AlkisLeser.AlkisDatei.GetPosition(XElement xe) in AlkisDatei.cs:Zeile 267.

此异常包含 InnerException System.ComponentModel.Win32Exception {"Ungültiges Fensterhandle"} InnerException 的堆栈跟踪是:

bei MS.Win32.UnsafeNativeMethods.GetWindowLongWndProc(HandleRef hWnd)
bei MS.Win32.HwndSubclass.UnhookWindowProc(Boolean force)
bei MS.Win32.HwndSubclass.Dispose()
bei MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks)
bei System.Windows.Threading.Dispatcher..ctor()
bei System.Windows.Threading.Dispatcher.get_CurrentDispatcher()
bei System.Windows.DependencyObject..ctor()
bei System.Windows.Media.PathFigureCollection.get_Empty()
bei System.Windows.Media.PathGeometry..cctor()

奇怪的事情:可执行文件确实可以在其他计算机上运行。

问题是什么?为什么 PathGeometry 构造函数会尝试访问某些窗口句柄?我该如何解决这个问题?

我正在使用 .NET 框架 4.0,并且代码在 VS2010 和 VS2012 上都会抛出。

4

1 回答 1

0

当本机 CreateWindowEx() api 函数调用失败时,您将获得此堆栈跟踪。它失败的原因很少,但有一个。您的程序很可能遭受了句柄泄漏,消耗了 10,000 个窗口句柄。此时 Windows 拒绝让您创建更多内容。

使用 Taskmgr.exe 的“进程”选项卡进行诊断。查看 + 选择列,勾选用户对象。还要勾选句柄和 GDI 对象,以防万一。观察您的过程的显示值。USER Objects 的稳步攀升价值意味着厄运。找到泄漏的原因可能有点困难。当然考虑一个内存分析器。任意注释掉代码块。如果您在 Taskmgr.exe 中没有看到泄漏,则说明有某种其他进程在干扰您的进程。任意将他们一一杀死以找到麻烦制造者。

最后但同样重要的是,看到一个工作线程创建一个窗口是一个麻烦的秘诀。我对 PathGeometry 知之甚少,但它肯定不像那种可以在工人身上正常工作的类。

于 2012-09-24T13:26:34.970 回答