为什么使用 Task 加载多个页面的内容长度会给我相同的结果?

Why using Task to load multiple pages' content length gives me the same result?

我正在尝试使用 .NET Core 中的 Task 异步获取多个页面的内容长度:

public static async Task GetContentLengthAsync(string url)
{
    HttpClient httpClient = new HttpClient();
    var httpResponse = await httpClient.GetAsync(url);
    var page = await httpResponse.Content.ReadAsStringAsync();
    Console.WriteLine(page.Length);
}

如果我这样使用它来获取前 100 页的内容长度:

for (int i = 1; i <= 100; i++)
{
    Task.Run(() => GetContentLengthAsync($"https://www.website.com/view/{i}"));
}

=> 所有输出相同或不同但不正确。 (但我很快就得到了结果)

如果我 运行 像这样等待的任务只需调用 GetLengthsAsync():

public static async void GetLengthsAsync()
{
    for (int i = 1; i <= 100; i++)
    {

        await Task.Run(() => GetContentLengthAsync($"https://www.website.com/view/{i}"));
    }
}

=> 输出是正确的,那时我仍然可以在控制台中输入并执行其他任务,但是每个 GetContentLengthAsync 任务都等待另一个任务完成并且一次只使用一个线程.有没有办法让它 运行 不仅异步而且同时在多个线程上不丢失信息?

P.S。我想使用 Tasks,因为它是一个大学项目,而且我知道可能有更好的方法(但这些是要求)。它更像是一个解决问题的任务,以更好地理解 Task 的工作原理。

for() 循环中的 lambda 函数将 'capture' the loop variable。大多数请求都是 /view/100.

for (int i = 1; i <= 100; i++)
{
   int localCopy = i;
   Task.Run(() => GetContentLengthAsync($"https://www.website.com/view/{localCopy}"));
}