问题 使用Font时WPF TextBlock内存泄漏


我在Windows 7上使用.NET 4.5,可能会发现内存泄漏。
我有一个 TextBlock (不 TextBox  - 它不是Undo问题),它每秒都会改变它的值(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>

我试过更新了 Text 直接来自代码或通过Binding的属性,它对两种方式都表现相同。

底线:
当。。。的时候 FontFamily 设置,实例 UnmanagedMemoryStream 每次我更新文本时都会继续(永远)。当我不(设置 FontFamily 财产),记忆力稳定。
(顺便说一句,它发生在我使用时 Label 代替 TextBlock 以及)

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


10453
2017-07-16 11:06


起源

我知道这是一个老问题,但出于好奇 - 您是否尝试将字体资源放入应用程序资源字典?它也泄漏了吗? <FontFamily x:Key="AppFont">pack://application:,,,/MyUIControls;component/./Fonts/#Noto Sans</FontFamily> 然后使用它 <Setter Property="FontFamily" Value="{StaticResource AppFont}" /> - Endrju


答案:


一个 FontFamily 泄漏 UnmanagedMemoryStreams 当它被使用时,如果它来自嵌入式资源或相对路径。当。。。的时候 FontFamily 源自系统字体或绝对路径,它不会泄漏。

你可以看 这里 并下载重现问题的项目。

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


13
2017-07-16 11:32



奇怪的。这是一个错误还是你可以处理字体? - Aron
@Aron:看看他们说的wpf团队的评论 - israel altar
Holy Moly,他们不会解决它(集中错误具有更高的影响力),这实际上意味着:专注于开发人员可以更容易注意到的错误...... - RoeeK
是否可以使用自定义字体作为具有绝对路径的资源?或者我们应该忘记使用自定义字体作为嵌入式资源? - Osi
重现问题的项目链接已中断。我在Microsoft Connect上找不到它。任何人都有工作链接或可以显示如何重现? - Magnus Lindhe