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.