Quick answer: Try synchronous ResourceLoader.load(path) first to surface failure with a stacktrace. Fix the failing dependency. Threaded load resolves normally afterward.
Loading a level scene threaded. Status sits at IN_PROGRESS forever. A texture or shader inside is failing import; the loader can’t complete the parent.
The Symptom
Progress bar at 30% and never moves. No error in console. Sync load also hangs or errors with a useful trace.
The Fix
# Diagnostic: synchronous load reveals the bad dep
var r = ResourceLoader.load("res://levels/forest.tscn")
# Output:
# ERROR: scene/resources/texture.cpp: failed loading res://art/missing.png
# At: scene/resources/scene_format_text.cpp
# Production: threaded load with progress bar
ResourceLoader.load_threaded_request("res://levels/forest.tscn")
var progress = []
while true:
var status = ResourceLoader.load_threaded_get_status(
"res://levels/forest.tscn", progress)
bar.value = progress[0] * 100
if status == ResourceLoader.THREAD_LOAD_LOADED: break
if status == ResourceLoader.THREAD_LOAD_FAILED: push_error("load failed"); break
await get_tree().process_frame
Synchronous form raises errors with full traces. Once you fix the failing subresource, threaded load completes normally.
Verifying
Reimport the broken asset (right-click → Reimport). Sync load returns. Threaded load now reaches LOADED state with progress 1.0.
“Sync to find the bad dep. Fix it. Threaded then works.”
Related Issues
For Resource UID, see UID. For C# signal emit, see signal emit.
Sync surfaces the bug. Fix. Threaded clears.