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.