为什么使用 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}"));
}
我正在尝试使用 .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}"));
}