Quick answer: CancellationTokenSource in node. Cancel in _ExitTree. Pass token to all awaits.
Boss enemy spawns timed orbs. Player exits scene mid-spawn. Tasks keep firing on freed node. Crash.
The Fix
public partial class Boss : Node {
CancellationTokenSource _cts = new();
public override void _ExitTree() {
_cts.Cancel();
_cts.Dispose();
}
public async Task SpawnOrbs() {
try {
for (int i = 0; i < 10; i++) {
await Task.Delay(500, _cts.Token);
SpawnOrb();
}
} catch (OperationCanceledException) { return; }
}
}
Cancellation chains through awaits. ExitTree cancels; Task ends cleanly.
Verifying
Leave scene mid-spawn. No crash. Tasks end. Without token: continued execution against freed node.
“Token. Cancel on exit. Clean.”
Related Issues
For C# disposed after await, see disposed. For C# async deadlock, see deadlock.
Cancel on exit. Tasks end.