From b9cf7ca714f9585529c27565c9979123d777b741 Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Fri, 12 Sep 2025 18:44:11 +1000 Subject: [PATCH] use sync context for invokeasync --- src/SharpIDE.Godot/NodeExtensions.cs | 39 +++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/SharpIDE.Godot/NodeExtensions.cs b/src/SharpIDE.Godot/NodeExtensions.cs index a34ab65..f2b2da6 100644 --- a/src/SharpIDE.Godot/NodeExtensions.cs +++ b/src/SharpIDE.Godot/NodeExtensions.cs @@ -37,6 +37,43 @@ public static class NodeExtensions extension(Node node) { public Task InvokeAsync(Action workItem) + { + var taskCompletionSource = new TaskCompletionSource(); + //WorkerThreadPool.AddTask(); + Dispatcher.SynchronizationContext.Post(_ => + { + try + { + workItem(); + taskCompletionSource.SetResult(); + } + catch (Exception ex) + { + taskCompletionSource.SetException(ex); + } + }, null); + return taskCompletionSource.Task; + } + + public Task InvokeAsync(Func workItem) + { + var taskCompletionSource = new TaskCompletionSource(); + Dispatcher.SynchronizationContext.Post(async void (_) => + { + try + { + await workItem(); + taskCompletionSource.SetResult(); + } + catch (Exception ex) + { + taskCompletionSource.SetException(ex); + } + }, null); + return taskCompletionSource.Task; + } + + public Task InvokeDeferredAsync(Action workItem) { var taskCompletionSource = new TaskCompletionSource(); //WorkerThreadPool.AddTask(); @@ -55,7 +92,7 @@ public static class NodeExtensions return taskCompletionSource.Task; } - public Task InvokeAsync(Func workItem) + public Task InvokeDeferredAsync(Func workItem) { var taskCompletionSource = new TaskCompletionSource(); //WorkerThreadPool.AddTask();