# V3214. Unity Engine. Using Unity API in the background thread may result in an error.

Анализатор обнаружил использование свойства, метода или конструктора после вызова `Awaitable.BackgroundThreadAsync`, которое при выполнении в фоновом потоке может привести к таким проблемам, как зависание или выброс исключения. Согласно документации Unity, все API, взаимодействующие с движком, должны использоваться строго из главного потока.

Рассмотрим пример:

    private async Awaitable LoadSceneAndDoHeavyComputation()
    {
      await Awaitable.BackgroundThreadAsync();
      await SceneManager.LoadSceneAsync("MainScene");
      ....
    }

    public async Awaitable Update()
    {
      if (....)
        await LoadSceneAndDoHeavyComputation();

      ....
    }

При выполнении метода `LoadSceneAndDoHeavyComputation` вызывается метод `Awaitable.BackgroundThreadAsync`, который переносит выполнение последующего кода в рамках того же метода в фоновый поток. Из-за этого проблемы могут возникнуть при последующем вызове метода `SceneManager.LoadSceneAsync`.

Избежать этого можно, вернувшись в главный поток с помощью метода `Awaitable.MainThreadAsync` перед вызовом `SceneManager.LoadSceneAsync`:

    private async Awaitable LoadSceneAndDoHeavyComputation()
    {
      await Awaitable.BackgroundThreadAsync();
      ....
      await Awaitable.MainThreadAsync();
      await SceneManager.LoadSceneAsync("MainScene");
    }

Или выполнив `SceneManager.LoadSceneAsync` перед переходом в фоновый поток:

    private async Awaitable LoadSceneAndDoHeavyComputation()
    {
      await SceneManager.LoadSceneAsync("MainScene");
      await Awaitable.BackgroundThreadAsync();
      ....
    }

Данная диагностика классифицируется как:

CWE-691