diff --git a/src/Paramore.Brighter/Tasks/BrighterTaskScheduler.cs b/src/Paramore.Brighter/Tasks/BrighterTaskScheduler.cs
index 58ae28df9..539b2c45a 100644
--- a/src/Paramore.Brighter/Tasks/BrighterTaskScheduler.cs
+++ b/src/Paramore.Brighter/Tasks/BrighterTaskScheduler.cs
@@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
+using System.Threading;
using System.Threading.Tasks;
namespace Paramore.Brighter.Tasks;
@@ -60,13 +61,14 @@ protected override void QueueTask(Task task)
var queued = _synchronizationHelper.Enqueue((Task)task, false);
if (!queued)
- {
+ {
Debug.IndentLevel = 1;
Debug.WriteLine($"BrighterTaskScheduler: QueueTask Failed to queue task {task.ToString()} on {System.Threading.Thread.CurrentThread.ManagedThreadId}");
Debug.IndentLevel = 0;
+ new Thread(TryExecuteNewThread) { IsBackground = true }.Start(task);
}
}
-
+
///
/// Attempts to execute the specified task on the current thread.
///
@@ -103,4 +105,28 @@ public void DoTryExecuteTask(Task task)
TryExecuteTask(task);
}
+
+ ///
+ /// In a new thread, attempts to execute the specified task.
+ ///
+ ///
+ /// This is a little "Hail Mary" to try and execute a task that has failed to queue because we have already completed the synchronization context.
+ /// Seems to be caused by an Exection Context that has our scheduler as the default, as it fools ConfigureAwait
+ ///
+ ///
+ ///
+ private void TryExecuteNewThread(object? obj)
+ {
+ var task = obj as Task;
+ if (task == null)
+ {
+ throw new ArgumentNullException(nameof(obj));
+ }
+
+ Debug.IndentLevel = 1;
+ Debug.WriteLine($"BrighterTaskScheduler: Use TryExecuteNewThread for {task} on thread {System.Threading.Thread.CurrentThread.ManagedThreadId}");
+ Debug.IndentLevel = 0;
+
+ TryExecuteTask(task);
+ }
}