Quick answer: Godot 4 C# await ToSignal hanging if the signal fires while the tree is paused? The await resumes on tree process - set ProcessMode to Always on the emitter and awaiter.
Pause menu emits a signal on resume. The C# coroutine that's awaiting it never wakes because the await machinery is gated on the paused tree.
Set ProcessMode Always
this.ProcessMode = ProcessModeEnum.Always;Both the awaiter node and the emitter need this. Otherwise the signal queue is drained on resume, not when it fires.
Or await a Task instead
Wrap the signal in a TaskCompletionSource. Tasks aren't tree-gated. Cleaner for pause-tolerant menu code.
Verify with print
Print this.GetTree().Paused in both nodes. If either is true at signal time and ProcessMode != Always, the await is stuck.
“Tree pause is a process-mode filter. Awaits that should outlive pause must opt out.”
For menu code, prefer Tasks over signals. Cancellation tokens compose better than ProcessMode trees in non-trivial flows.