使用Font时WPF TextBlock内存泄漏

Roe*_*eeK 13 c# wpf xaml

我在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>
Run Code Online (Sandbox Code Playgroud)

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

底线:
FontFamily设置时,UnmanagedMemoryStream每次我更新文本时都会继续(永远)继续实例.当我没有(设置FontFamily属性)时,内存是稳定的.
(顺便说一句,它发生在我使用Label而不是TextBlock那样)

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

isr*_*tar 15

FontFamily泄漏UnmanagedMemoryStreams时,如果它是从嵌入的资源或相对路径来源就使用它.当FontFamily源自系统字体或绝对路径时,它不会泄漏.

您可以在此处查看并下载重现问题的项目.

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

  • 是否可以使用自定义字体作为具有绝对路径的资源?或者我们应该忘记使用自定义字体作为嵌入式资源? (4认同)
  • Holy Moly,他们不会解决它(专注于更高影响的bug),这实际上意味着:专注于开发人员可以更容易注意到的bug ... (3认同)