Quick answer: Godot 4 C# many concurrent ResourceLoader.LoadThreaded calls saturating the thread pool? Each load takes a worker - cap concurrent loads with a semaphore.

100 concurrent loads queued; thread pool empties; new tasks queue indefinitely.

Use SemaphoreSlim

var sem = new SemaphoreSlim(4);
await sem.WaitAsync();

Caps concurrent loads to 4. Thread pool stays available.

Or use Task.WhenAll with batches

Process 10 at a time; sequential batches. Bounded concurrency.

Profile thread pool usage

Per-task thread distribution visible. Saturation surfaces.

“Thread pools have finite workers. Concurrent loads need throttling.”

If your project triggers many async loads, the semaphore pattern is mandatory. Document.

Related reading