Quick answer: Godot 4 C# async Task awaiting a signal blocked on quit_requested? Tree shutdown waits for tasks; tasks wait for tree - both deadlock.

User clicks quit. Editor hangs because an async download is waiting on a signal that won't fire.

Use CancellationToken

Pass a token through async ops. Tree quit cancels the token; tasks finish gracefully.

Hook quit signal

SceneTree.QuitRequested: cancel all pending tasks before allowing quit.

Avoid awaits over tree lifetime

Long-running awaits should be cancellable. Document the pattern.

“Async lifetimes need cancellation paths.”

If your C# Godot project has long-running tasks, cancellation tokens are mandatory. The quit deadlock is the visible bug.

Related reading