Load local file with WWW can only sync?

private IEnumerator Load (string path) {
string url = “file://” + path;
WWW www = new WWW (url);
StartCoroutine (Progress (www));
yield return www;
Debug.Log (“Finished”);
}

private IEnumerator Progress (WWW www) {
   while (!www.isDone) {
      Debug.Log ((((int)(www.progress * 100)) % 100) + "%");
      yield return null;
   }
}

Above method Debug.Log only once.

But if use below method, Debug.Log executed multiple times.

 private IEnumerator Load (string path) {
    string url = "https://img14.artimg.net/gallery/2018/1020/154003292410837640.JPG";
    WWW www = new WWW (url);
    StartCoroutine (Progress (www));
    yield return www;
    Debug.Log ("Finished");
 }
 
 private IEnumerator Progress (WWW www) {
    while (!www.isDone) {
       Debug.Log ((((int)(www.progress * 100)) % 100) + "%");
       yield return null;
    }
 }

How do load local file async with WWW?

WWW is deprecated and obsolete now.
Consider using UnityWevRequest

IEnumerator GetImage(string url, System.Action<Texture> callback)
    {
        using (UnityWebRequest www = UnityWebRequestTexture.GetTexture(url))
        {
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.Log(www.error);
            }
            else
            {
                Texture myTexture = ((DownloadHandlerTexture)www.downloadHandler).texture;
                callback?.Invoke(myTexture);
            }
        }
        
    }

    void DoStaff()
    {
        StartCoroutine(GetImage("http://images.earthcam.com/ec_metros/ourcams/fridays.jpg", tex =>
        {
            // Do staff with the texture
        }));
    }