Quick answer: Godot 4 C# signal emit from worker thread deadlocking the engine? Signal emission must happen on main - marshal via CallDeferred or use Godot.Bridge.CallableBridge.

Background HTTP request completes on a worker. Calls EmitSignal to notify UI. Editor freezes.

Defer the emit

CallDeferred(MethodName.OnLoaded);

Schedules the emit on the main thread. The signal fires safely.

Or use Callable.From

Callable.From(this, MethodName.OnLoaded).CallDeferred(). Same effect; functional style.

Avoid Godot Object touches from worker

Any Godot Object property access from a non-main thread is undefined. Marshal everything.

“Godot's main thread is the only safe place for signal emit. C# threading inherits the constraint.”

Build a small ThreadHelper class with WorkerToMain(Action) that returns a Task. Centralizes the marshalling so business code stays clean.