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.