Skip to content

Commit

Permalink
fix: Task Scheduler Queue Task called when SychronizationContext disp…
Browse files Browse the repository at this point in the history
…osed (#3451)

* fix: add immediate execution back

* fix: use a new thread if the context has closed

* fix: missing code, should have been in last commit
  • Loading branch information
iancooper authored Dec 31, 2024
1 parent 65d03cd commit d91839e
Showing 1 changed file with 28 additions and 2 deletions.
30 changes: 28 additions & 2 deletions src/Paramore.Brighter/Tasks/BrighterTaskScheduler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace Paramore.Brighter.Tasks;
Expand Down Expand Up @@ -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);
}
}

/// <summary>
/// Attempts to execute the specified task on the current thread.
/// </summary>
Expand Down Expand Up @@ -103,4 +105,28 @@ public void DoTryExecuteTask(Task task)

TryExecuteTask(task);
}

/// <summary>
/// In a new thread, attempts to execute the specified task.
/// </summary>
/// <remarks>
/// 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
/// </remarks>
/// <param name="obj"></param>
/// <exception cref="ArgumentNullException"></exception>
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);
}
}

0 comments on commit d91839e

Please sign in to comment.