我在 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/