diff --git a/src/Avalonia.Base/Media/Fonts/EmbeddedFontCollection.cs b/src/Avalonia.Base/Media/Fonts/EmbeddedFontCollection.cs index 7f12825a66..f2fb490592 100644 --- a/src/Avalonia.Base/Media/Fonts/EmbeddedFontCollection.cs +++ b/src/Avalonia.Base/Media/Fonts/EmbeddedFontCollection.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; @@ -9,8 +10,7 @@ namespace Avalonia.Media.Fonts { public class EmbeddedFontCollection : IFontCollection { - private readonly Dictionary> _glyphTypefaceCache = - new Dictionary>(); + private readonly ConcurrentDictionary> _glyphTypefaceCache = new(); private readonly List _fontFamilies = new List(1); @@ -45,11 +45,12 @@ namespace Avalonia.Media.Fonts { if (!_glyphTypefaceCache.TryGetValue(glyphTypeface.FamilyName, out var glyphTypefaces)) { - glyphTypefaces = new Dictionary(); + glyphTypefaces = new ConcurrentDictionary(); - _glyphTypefaceCache.Add(glyphTypeface.FamilyName, glyphTypefaces); - - _fontFamilies.Add(new FontFamily(_key, glyphTypeface.FamilyName)); + if (_glyphTypefaceCache.TryAdd(glyphTypeface.FamilyName, glyphTypefaces)) + { + _fontFamilies.Add(new FontFamily(_key, glyphTypeface.FamilyName)); + } } var key = new FontCollectionKey( @@ -57,10 +58,7 @@ namespace Avalonia.Media.Fonts glyphTypeface.Weight, glyphTypeface.Stretch); - if (!glyphTypefaces.ContainsKey(key)) - { - glyphTypefaces.Add(key, glyphTypeface); - } + glyphTypefaces.TryAdd(key, glyphTypeface); } } } @@ -119,7 +117,7 @@ namespace Avalonia.Media.Fonts } private static bool TryGetNearestMatch( - Dictionary glyphTypefaces, + ConcurrentDictionary glyphTypefaces, FontCollectionKey key, [NotNullWhen(true)] out IGlyphTypeface? glyphTypeface) { @@ -173,7 +171,7 @@ namespace Avalonia.Media.Fonts } private static bool TryFindStretchFallback( - Dictionary glyphTypefaces, + ConcurrentDictionary glyphTypefaces, FontCollectionKey key, [NotNullWhen(true)] out IGlyphTypeface? glyphTypeface) { @@ -206,7 +204,7 @@ namespace Avalonia.Media.Fonts } private static bool TryFindWeightFallback( - Dictionary glyphTypefaces, + ConcurrentDictionary glyphTypefaces, FontCollectionKey key, [NotNullWhen(true)] out IGlyphTypeface? typeface) {