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

标签 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>

我尝试直接从代码或通过绑定(bind)更新 Text 属性,这两种方式的行为相同。

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

看起来像是内存泄漏,但我找不到任何相关的引用资料。
关于如何解决它有什么建议吗?

最佳答案

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

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

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

关于c# - 使用字体时 WPF TextBlock 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31452443/

相关文章:

c# - LINQ to SQL 通配符

c# - 有没有办法让 SharpDevelop 程序始终保持在其他窗口之上?

c# - 设置列表框的默认值

c# - 在 MVVM 应用程序中使用 RSS 提要加载 Xdocument

.net - 我如何告诉 ContextMenu 将其自身相对于其控件而不是光标放置?

c# - 贪吃蛇游戏绘制数组函数

c# - 如何将 XmlSerializer 类发送到 WebService 然后反序列化它?

c# - 在 WPF 中实现 Console.ReadLine?

wpf - {x :Static} and {StaticResource} in XAML WPF 之间的差异

c# - 如何从 StreamGeometry 中提取 Point 对象?