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.