diff --git a/src/Skia/Avalonia.Skia/GeometryImpl.cs b/src/Skia/Avalonia.Skia/GeometryImpl.cs index a5797d7fd5..1685dc9d20 100644 --- a/src/Skia/Avalonia.Skia/GeometryImpl.cs +++ b/src/Skia/Avalonia.Skia/GeometryImpl.cs @@ -13,6 +13,7 @@ namespace Avalonia.Skia /// internal abstract class GeometryImpl : IGeometryImpl { + private readonly object _lock = new(); private PathCache _pathCache; private SKPathMeasure? _cachedPathMeasure; @@ -45,9 +46,12 @@ namespace Avalonia.Skia /// public bool StrokeContains(IPen? pen, Point point) { - _pathCache.UpdateIfNeeded(StrokePath, pen); + lock (_lock) + { + _pathCache.UpdateIfNeeded(StrokePath, pen); - return PathContainsCore(_pathCache.ExpandedPath, point); + return PathContainsCore(_pathCache.ExpandedPath, point); + } } /// @@ -73,8 +77,11 @@ namespace Avalonia.Skia /// public Rect GetRenderBounds(IPen? pen) { - _pathCache.UpdateIfNeeded(StrokePath, pen); - return _pathCache.RenderBounds; + lock (_lock) + { + _pathCache.UpdateIfNeeded(StrokePath, pen); + return _pathCache.RenderBounds; + } } public IGeometryImpl GetWidenedGeometry(IPen pen) @@ -154,8 +161,11 @@ namespace Avalonia.Skia /// protected void InvalidateCaches() { - _pathCache.Dispose(); - _pathCache = default; + lock (_lock) + { + _pathCache.Dispose(); + _pathCache = default; + } } private struct PathCache : IDisposable