From d96561cf366611b5c847d28896d6446168271d38 Mon Sep 17 00:00:00 2001 From: Egor Rudakov <28976936+EgorRudakov2@users.noreply.github.com> Date: Thu, 3 Jul 2025 15:00:45 +0300 Subject: [PATCH] Fix random NRE inside `Compositor.CommitCore()` callback. (#19173) * Prevent ContinueWith from scheduling some of rendering callbacks into UI thread. (#19170 fix) * Add _pendingBatch null check --- src/Avalonia.Base/Media/MediaContext.Compositor.cs | 2 +- .../Rendering/Composition/CompositingRenderer.cs | 3 ++- src/Avalonia.Base/Rendering/Composition/Compositor.cs | 7 ++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Base/Media/MediaContext.Compositor.cs b/src/Avalonia.Base/Media/MediaContext.Compositor.cs index 85f7df2587..69663d33b9 100644 --- a/src/Avalonia.Base/Media/MediaContext.Compositor.cs +++ b/src/Avalonia.Base/Media/MediaContext.Compositor.cs @@ -31,7 +31,7 @@ partial class MediaContext _pendingCompositionBatches[compositor] = commit; commit.Processed.ContinueWith(_ => _dispatcher.Post(() => CompositionBatchFinished(compositor, commit), DispatcherPriority.Send), - TaskContinuationOptions.ExecuteSynchronously); + CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); return commit; } diff --git a/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs b/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs index 98fb147c2c..6a0396e52a 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositingRenderer.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Numerics; +using System.Threading; using System.Threading.Tasks; using Avalonia.Collections; using Avalonia.Collections.Pooled; @@ -187,7 +188,7 @@ internal class CompositingRenderer : IRendererWithCompositor, IHitTester { _queuedSceneInvalidation = false; SceneInvalidated?.Invoke(this, new SceneInvalidatedEventArgs(_root, new Rect(_root.ClientSize))); - }, DispatcherPriority.Input), TaskContinuationOptions.ExecuteSynchronously); + }, DispatcherPriority.Input), CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); } } diff --git a/src/Avalonia.Base/Rendering/Composition/Compositor.cs b/src/Avalonia.Base/Rendering/Composition/Compositor.cs index 257e41f2d6..e8cd29f195 100644 --- a/src/Avalonia.Base/Rendering/Composition/Compositor.cs +++ b/src/Avalonia.Base/Rendering/Composition/Compositor.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; using Avalonia.Animation; using Avalonia.Animation.Easings; @@ -114,7 +115,7 @@ namespace Avalonia.Rendering.Composition if (pending != null) pending.Processed.ContinueWith( _ => Dispatcher.Post(_triggerCommitRequested, DispatcherPriority.Send), - TaskContinuationOptions.ExecuteSynchronously); + CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); else _triggerCommitRequested(); } @@ -202,10 +203,10 @@ namespace Avalonia.Rendering.Composition { lock (_pendingBatchLock) { - if (_pendingBatch.Processed == t) + if (_pendingBatch?.Processed == t) _pendingBatch = null; } - }, TaskContinuationOptions.ExecuteSynchronously); + }, CancellationToken.None, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); _nextCommit = null; return commit;