瀏覽代碼

Set current SynchronizationContext before the game loop starts

This fixes the problem that `SynchronizationContext.Current` would be null
during the call to `_EnterTree`, `_Ready` and the first call to `_Process` thus
the task continuations would be scheduled outside the main thread, which is unexpected and might lead to crashes.

With this change, task continuations are scheduled always on the main thread and so async/await can be used without any explicit synchronization, which is what is expected.

Fixes #18849
Adam Cigánek 7 年之前
父節點
當前提交
f25240cfe6
共有 1 個文件被更改,包括 1 次插入1 次删除
  1. 1 1
      modules/mono/glue/cs_files/GodotTaskScheduler.cs

+ 1 - 1
modules/mono/glue/cs_files/GodotTaskScheduler.cs

@@ -14,6 +14,7 @@ namespace Godot
 		public GodotTaskScheduler()
 		public GodotTaskScheduler()
 		{
 		{
 			Context = new GodotSynchronizationContext();
 			Context = new GodotSynchronizationContext();
+			SynchronizationContext.SetSynchronizationContext(Context);
 		}
 		}
 
 
 		protected sealed override void QueueTask(Task task)
 		protected sealed override void QueueTask(Task task)
@@ -57,7 +58,6 @@ namespace Godot
 
 
 		public void Activate()
 		public void Activate()
 		{
 		{
-			SynchronizationContext.SetSynchronizationContext(Context);
 			ExecuteQueuedTasks();
 			ExecuteQueuedTasks();
 			Context.ExecutePendingContinuations();
 			Context.ExecutePendingContinuations();
 		}
 		}