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.