C# 使用字体时WPF TextBlock内存泄漏

C# 使用字体时WPF TextBlock内存泄漏,c#,wpf,xaml,C#,Wpf,Xaml,我正在Windows 7上使用.NET 4.5,可能会发现内存泄漏。 我有一个TextBlock(不是TextBox——这不是撤销问题),它每秒都会改变它的值(CPU使用率、时间等)。 通过使用.NET内存档案器(并通过简单地观察任务管理器),我注意到内存一直在增长。更准确地说,我看到越来越多的UnmanagedMemoryStream(我尝试了GC.Collect(),但显然没有做任何事情) 经过一些测试,我发现只有当我将TextBlock字体设置为资源字体时,才会出现此问题,如下所示: &l

我正在Windows 7上使用.NET 4.5,可能会发现内存泄漏。
我有一个
TextBlock
(不是
TextBox
——这不是撤销问题),它每秒都会改变它的值(CPU使用率、时间等)。
通过使用
.NET内存档案器
(并通过简单地观察任务管理器),我注意到内存一直在增长。更准确地说,我看到越来越多的
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
属性,这两种方式的行为相同

底线:
当设置
fontframy
时,
UnmanagedMemoryStream
的实例会在每次我更新文本时持续出现(永远)。当我不设置(设置
fontfamine
属性)时,内存是稳定的。
(顺便说一句,当我使用
Label
而不是
TextBlock
时也会发生这种情况)

看起来像是内存泄漏,但我找不到任何关于它的参考资料。

关于如何解决此问题的任何建议?

A
FontFamily
leaks
UnmanagedMemoryStreams
,如果它来自嵌入式资源或相对路径,则在使用时会泄漏。当
FontFamily
源于系统字体或绝对路径时,它不会泄漏

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

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

。这是一个bug还是你可以处理字体?@Aron:看看wpf团队的评论,他们说它是iSoly Moly,他们不会修复它(关注影响更大的bug),这实际上意味着:关注开发者更容易注意到的bug……是否可以使用自定义字体作为绝对路径的资源?或者我们应该忘记使用自定义字体作为嵌入资源?复制问题的项目链接已断开。我在Microsoft Connect上找不到它。任何人都有一个工作链接或者可以演示如何复制?我知道这是一个老问题,但出于好奇-您是否尝试将字体资源放入应用程序资源字典中?它也漏水吗<代码>pack://application:,,,/mys;component//Fonts/#Noto Sans,然后使用它
,因为@Endrju的建议实质上是在资源目录中创建字体族对象的一个单例,它应该解决内存问题。