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.