使用Font时WPF TextBlock内存泄漏

时间:2015-07-16 11:06:35

标签: c# wpf xaml

我在Windows 7上使用.NET 4.5,可能会发现内存泄漏 我有TextBlock(不是TextBox - 它不是撤消问题),它每秒都会更改其值(CPU使用率,时间等等)。
使用.NET Memory Profiler(并通过简单地观察任务管理器)我注意到内存不断增长。为了更准确,我看到越来越多UnmanagedMemoryStream的实时实例(我尝试了GC.Collect()显然没有做任何事情)。

经过一些测试后,我发现只有在我将TextBlock字体设置为资源字体时,才会出现此问题,如下所示:

<Style TargetType="{x:Type TextBlock}">
    <Setter Property="Control.Foreground" Value="#CCCCCC"/>
    <Setter Property="FontFamily" Value="pack://application:,,,/MyUIControls;component/./Fonts/#Noto Sans"/>
</Style>

我尝试直接从代码或通过Binding更新Text属性,两种方式的行为相同。

底线:
设置FontFamily后,每次我更新文本时UnmanagedMemoryStream的实例都会继续(永久)。当我没有(设置FontFamily属性)时,内存是稳定的 (顺便说一句,当我使用Label代替TextBlock时也会发生这种情况)

它看起来像是内存泄漏,但我找不到任何关于它的参考 有关如何解决的任何建议?

1 个答案:

答案 0 :(得分:14)

如果FontFamily来自嵌入式资源或相对路径,则UnmanagedMemoryStreams会泄漏FontFamily。当//Set no caching header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); 来自系统字体或绝对路径时,它不会泄漏。

您可以查看here并下载重现问题的项目。

解决方法:对于资源字体:将字体保存到临时文件夹中,并使用存储字体的绝对路径。 对于相对路径字体:改为解析并使用绝对路径。