# 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:

    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:

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

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

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

This diagnostic is classified as:

CWE-691