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

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

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

```cpp
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`:

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

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

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