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