From 8b131bd1923fcc5e31657e77f2d05291894d9ecc Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Thu, 27 Nov 2025 10:01:10 +0100 Subject: [PATCH] Fix headless race condition (#20143) --- .../HeadlessWindowExtensions.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs b/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs index 9909f053fa..7f33490caf 100644 --- a/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs +++ b/src/Headless/Avalonia.Headless/HeadlessWindowExtensions.cs @@ -138,11 +138,25 @@ public static class HeadlessWindowExtensions private static void RunJobsOnImpl(this TopLevel topLevel, Action action) { - Dispatcher.UIThread.RunJobs(); - AvaloniaHeadlessPlatform.ForceRenderTimerTick(); - Dispatcher.UIThread.RunJobs(); + RunJobsAndRender(); action(GetImpl(topLevel)); - Dispatcher.UIThread.RunJobs(); + RunJobsAndRender(); + + void RunJobsAndRender() + { + var count = 0; + var dispatcher = Dispatcher.UIThread; + + while (dispatcher.HasJobsWithPriority(DispatcherPriority.MinimumActiveValue)) + { + if (count >= 10) + throw new InvalidOperationException("Dispatcher job loop detected"); + + dispatcher.RunJobs(); + AvaloniaHeadlessPlatform.ForceRenderTimerTick(); + ++count; + } + } } private static IHeadlessWindow GetImpl(this TopLevel topLevel)