我的 WPF 应用程序以大约 4kb/s 的速度泄漏内存。任务管理器中的内存使用量不断攀升,直到应用程序因“内存不足”异常而崩溃。
通过我自己的研究,我发现这里讨论了这个问题:Track down memory leak in WPF and #8 here: http://blogs.msdn.com/jgoldb/archive/2008/02/04/finding-memory-泄漏-在-wpf-based-applications.aspx
所描述的问题是: 这是 WPF 中存在的漏洞,存在于 .NET 3.5 SP1 之前的框架版本中。这是因为 WPF 选择使用哪个 HWND 将消息从呈现线程发送到 UI 线程的方式。此示例销毁创建的第一个 HWND 并在新窗口中启动动画。这会导致从渲染线程发送的消息堆积而不被处理,从而有效地泄漏内存。
提供的解决方案是: 解决方法是首先在您的 App 类构造函数中创建一个新的 HwndSource。这必须在 WPF 创建任何其他 HWND 之前创建。只需创建这个 HwndSource,WPF 就会使用它来将消息从渲染线程发送到 UI 线程。这确保了所有消息都将被处理,并且不会泄漏。
但我不明白解决方案! 我有一个正在使用的 Application 子类,我尝试在该构造函数中创建一个窗口,但这并没有解决问题。
按照字面上给出的说明,看起来我只需要将其添加到我的 Application 构造函数中:
new HwndSource(new HwndSourceParameters("MyApplication"));