Утечка памяти в WPF TextBlock при использовании шрифта
Я использую.NET 4.5 в Windows 7 и могу обнаружить утечку памяти.
у меня есть TextBlock
(не TextBox
- это не проблема отмены), которая меняет свое значение каждую секунду (загрузка процессора, время и т. д.).
С помощью .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
также)
Это похоже на утечку памяти, но я не смог найти никакой ссылки на это.
Любые предложения о том, как это можно решить?
1 ответ
FontFamily
утечки UnmanagedMemoryStreams
когда он используется, если он был получен из встроенного ресурса или относительного пути. Когда FontFamily
получен из системного шрифта или абсолютного пути, он не протекает.
Вы можете посмотреть здесь и скачать проект, который воспроизводит проблему.
Обходной путь: Для ресурсных шрифтов: сохраните шрифты во временной папке и используйте абсолютный путь к сохраненному шрифту. Для шрифтов относительного пути: разрешите и используйте вместо этого абсолютный путь.