WPF TextBlock Speicherverlust bei Verwendung von Schriftart

8

Ich verwende .NET 4.5 unter Windows 7 und finde möglicherweise ein Speicherleck.
Ich habe eine TextBlock (nicht TextBox - es ist nicht das Problem mit dem Rückgängigmachen), die ihren Wert jede Sekunde ändert (CPU-Auslastung, Zeit, etc ...).
Mit .NET Memory Profiler (und indem ich einfach den Task-Manager beobachte) bemerkte ich, dass der Speicher weiter wuchs. Um genauer zu sein, sehe ich mehr und mehr Live-Instanzen von UnmanagedMemoryStream (Ich habe GC.Collect() versucht, was offensichtlich nichts getan hat).

Nach einigen Tests habe ich festgestellt, dass dieses Problem nur auftritt, wenn ich die Schriftart TextBlock wie folgt auf eine Ressourcenschriftart einstelle:

%Vor%

Ich habe versucht, die Eigenschaft Text direkt aus dem Code oder über Binding zu aktualisieren, sie verhält sich für beide Arten gleich.

Unterm Strich:
Wenn FontFamily gesetzt ist, kommen Instanzen von UnmanagedMemoryStream immer wieder (für immer), wenn ich den Text aktualisiere. Wenn ich nicht (die Eigenschaft FontFamily festlegen), ist der Speicher stabil.
(Übrigens passiert es, wenn ich auch Label anstelle von TextBlock verwende)

Es sieht aus wie ein Speicherleck, aber ich konnte keinen Hinweis darauf finden.
Irgendwelche Vorschläge, wie kann es gelöst werden?

    
RoeeK 16.07.2015, 11:06
quelle

1 Antwort

10

A FontFamily leckt UnmanagedMemoryStreams , wenn es verwendet wird, wenn es von einer eingebetteten Ressource oder einem relativen Pfad stammt. Wenn FontFamily aus einer Systemschrift oder einem absoluten Pfad stammt, ist es nicht undicht.

Sie können hier und lade das Projekt herunter, das das Problem reproduziert.

Workaround : Für Ressourcenschriftarten: Speichern Sie Schriftarten in einem temporären Ordner und verwenden Sie den absoluten Pfad zur gespeicherten Schriftart. Für Schriften mit relativer Pfadangabe: Auflösen und stattdessen den absoluten Pfad verwenden.

    
israel altar 16.07.2015, 11:32
quelle

Tags und Links