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

The analyzer has detected that a property, method, or constructor is used after calling Awaitable\.BackgroundThreadAsync\. It may cause issues such as application hangs or throwing an exception when executed on a background thread\. The Unity documentation states that all APIs that interact with the engine must be used exclusively on the main thread\.

Look at the following example:

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

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

  ....
}
```

When the `LoadSceneAndDoHeavyComputation` method is executed, the call to the `Awaitable.BackgroundThreadAsync` method switches the subsequent code execution within the same method to the background thread\. This may cause issues when the `SceneManager.LoadSceneAsync` method is called later\.

To avoid this, use the `Awaitable.MainThreadAsync` method to return to the main thread before calling the `SceneManager.LoadSceneAsync` method:

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

Alternatively, execute `SceneManager.LoadSceneAsync` before switching to the background thread:

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