[[Использовать SynchronizationContext, вместо EditorApplication.delayCall для работы в главном потоке из thread-pool-потоков]] ### Что это вообще за «контекст синхронизации»? |Термин|Что означает| |---|---| |**`SynchronizationContext`** (контекст синхронизации)|Абстракция .NET, описывающая **правило, на каком потоке должны выполняться «продолжения»** асинхронных операций.| |**`Post`**|Асинхронно кладёт делегат в очередь указанного контекста. Не блокирует вызывающий поток.| |**`Send`**|Выполняет делегат синхронно на целевом контексте (может заблокировать).| #### Как Unity использует контекст - При запуске Editor Unity создаёт собственный `SynchronizationContext` и **привязывает его к главному потоку**. - Любой `await` внутри Editor-скрипта, который выполняется на главном потоке, «запоминает» этот контекст. Поэтому после `await` код продолжает исполняться опять же на главном потоке — именно так работают асинхронные Editor-скрипты. ### Коротко - **`SynchronizationContext`** — это «адрес» главного потока; `Post` — «письмо» в этот адрес. - Захватили контекст при старте → пересылаем в него любую Unity-чувствительную работу, даже если исходный вызов пришёл с другого потока. - Надёжно устраняет ошибки вида _«…can only be called from the main thread»_ и не зависит от фокуса Editor.