Quick answer: Godot 4 C# await on a Godot.Object signal throwing 'object disposed' when the object frees during await? Use SignalAwaiter with cancellation or check is_instance_valid before resuming.

Await for a button's Pressed signal. Button is freed; await throws when the signal would have fired.

Wrap in try/catch

try {{ await ToSignal(btn, "pressed"); }}
catch (ObjectDisposedException) {{ }}

Catches the exception; graceful exit.

Use cancellation token

Pass a CancellationToken to ToSignal-like helpers. Cancel on object free; await throws OperationCanceledException.

Avoid awaits across object lifetime

If the object might be freed, don't await its signals from outside it. Restructure to internal await.

“Godot objects can be freed; C# awaits don't know.”

Most C# code in Godot needs disposal-aware awaits. Build a helper that wraps ToSignal with the try/catch; reuse.

Related reading