A Coroutine spreads work over time without blocking the game.

using System.Collections;

IEnumerator Wait()
{
    yield return new WaitForSeconds(2f);
    Debug.Log("Done");
}

Start:

StartCoroutine(Wait());

Other waits:

yield return null;
yield return new WaitForSecondsRealtime(1f);

A Coroutine is not a separate thread.